Проблема с соединением JDBC - PullRequest
1 голос
/ 28 января 2009

Я создал метод getDBConnection в своем приложении Java. Это возвращает объект соединения, и, следовательно, я не закрывал это соединение в самом методе.

Теперь я вызываю этот метод из различных методов в моем приложении через регулярные промежутки времени и закрываю их внутри блока try - finally. Я думал, что это должно освободить соединение после использования. Тем не менее, я вижу большое количество открытых соединений (около 50) на вкладке Соединения сервера администратора MySQL.

//Defining a method to retrieve a database connection
// PropDemo is a properties class that retrieves Database related values from a file
public Connection getDBConnection() {

    //Instantiating the Properties object
    PropDemo prop = new PropDemo();
    Connection con = null;

    // Retrieving values from the parameters.properties file
    String JdbcDriver = prop.getMessage("JdbcDriver");
    String JdbcUrlPrefix = prop.getMessage("JdbcUrlPrefix");
    String DBIP = prop.getMessage("DBIP");
    String DBName = prop.getMessage("DBName");
    String DBUser = prop.getMessage("DBUser");
    String DBPassword = prop.getMessage("DBPassword");

    try {

        // Loading and instantiating the JDBC MySQL connector driver class
        Class.forName(JdbcDriver).newInstance();
        con = DriverManager.getConnection(JdbcUrlPrefix + DBIP + "/" + DBName, DBUser, DBPassword);


          if (con.isClosed())
                    Logger.log("Connection cannot be established", "vm");

    } catch (Exception e) {
        Logger.log("Exception: " + e, "vm");
        Logger.log(Logger.stack2string(e), "vm");
    }
    return con;

}

Я также закрываю связанные объекты ResultSet и Statement. Чего здесь не хватает?

Я планирую заменить все выписки на PreparedStatements по соображениям эффективности и безопасности. Это поможет значительно? Что еще можно сделать?

EDIT: Это просто базовое Java-приложение, которое постоянно запрашивает изменения в некоторых полях базы данных MySQL через коннектор MySQL-JDBC. Я не использую какие-либо фреймворки, такие как Spring или Hibernate.

Ответы [ 4 ]

1 голос
/ 28 января 2009

Ваш код выглядит вменяемым.

Вот как вы создаете новое соединение.

Возможно, ошибка в том, где вы ее закрываете.

Вы должны закрыть его в блоке finally.

Некоторые дополнительные вопросы.

1) Вы уверены, что эти 50 соединений получены из этой программы? Может быть, из вашего офиса приходят другие. Чтобы это подтвердить, вам нужно остановить программу и снова посмотреть на монитор подключений.

2) Использует ли ваше приложение несколько соединений одновременно? Вероятно, это пик, когда вы используете 50 одновременно.

Если вы можете опубликовать код, где вы закрываете соединение. Скорее всего, проблема есть.

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

Сколько JDBC-соединений в Java?

0 голосов
/ 28 января 2009

Используете ли вы ваше соединение JDBC на сервере приложений J2EE или в Hibernate? Оба они имеют тенденцию начинаться с довольно большого пула соединений, поэтому вы увидите большое число.

Проверьте информацию о пуле подключений.

0 голосов
/ 28 января 2009

Вы можете использовать единый подход к проблеме и создать новый объект Соединения, только если текущий объект имеет значение null:

If (connectionObject != null){
   return connectionObject;
}else {
   //create new connection object
}

Это обеспечит наличие только одного ненулевого соединения в любое время.

0 голосов
/ 28 января 2009

Вы закрываете объект подключения, когда приложение также закрывается?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...