2012-04-06 1 views
7

После закрытия соединения с базой данных в java, могу ли я открыть его повторно? Или мне нужно снова сделать DriverManager.getConnection()?Восстановить подключение к базе данных в Java

+4

Чего так трудно испытать? –

+0

Также вы видите какой-либо открытый метод подключения? – MrJames

+0

Я не вижу никакого открытого метода в соединении. Итак, как я могу попробовать? Вызов 'getConnection' будет работать, попробовал, но есть ли« правильный »способ? –

ответ

4

Я не уверен на 100%, что вам необходимо позвонить по телефону DriverManager.getConnection(), но какой вред? Вы уже закрыли соединение, просто возьмите новый, когда вам это нужно. Сборщик мусора заботится об этом закрытом соединении после того, как вы его отбросите.

1

да, вы не можете сделать ничего после закрытия подключение. вы должны вызвать getConnection

0

Как Javadoc упоминает:

getConnection: Attempts to establish a connection to the given database URL. 

Поэтому да, называя GetConnection() снова выглядит как единственный способ установить новое соединение с базой данных, как только вы закрыли предыдущее соединение.

7

Если вы звонили connection.close();, connection (при условии, что java.sql.Connection) становится бесполезным. Эта операция освобождает базу данных объекта Connection и ресурсы JDBC.

Так Да вам нужно получить новую связь, когда, прежде чем перейти на

connection = DriverManager.getConnection() 
+0

Я только начал использовать JDBC для соединений SQL Server после того, как сделал все на C#, и мальчик был большой загадкой в ​​течение половины моего дня вчера. – JoeManiaci

0

Ну идеале я сделал несколько иной подход и дал другое решение.

Вместо открытия и закрытия базы данных, которая буквально происходит по каждому запросу клиента, я сделал один экземпляр класса и сделал одно открытое соединение, которое будет использоваться повторно до тех пор, пока процесс сервера будет активным.

Короче:

У меня есть getConnection() внутри Database класса

public Connection getConnection() throws Exception { 
    try { 
     String connectionURL = "jdbc:mysql://localhost:3306/someDatabase"; 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if (connection == null) { 
      connection = DriverManager.getConnection(connectionURL, "someUser", LOCAL_MYSQL_PASSWORD); 
     } 

     return connection; 
    } catch (Exception e) { 
    } 

} 

Database класс синглтон, поэтому повторное использование того же класса и повторно использовать то же самое соединение.

Я тестировал это на show processList, и это давало около 100 соединений. Если я не закрою соединение, и даже если я закрою соединение, фактический процесс вряд ли будет убит, но засыпают вместо этого он будет использоваться, когда один и тот же клиент будет запрашивать один и тот же запрос, но если у вас есть 15 запросов, каждый из них будет иметь отдельные процессы, поэтому закрытие и открытие соединения для меня не было лучшим решением.

У меня есть один процесс, который отвечает за запросы.