1

Java アプリケーションで getDBConnection メソッドを作成しました。これは接続オブジェクトを返すため、このメソッド自体でこの接続を閉じていません。

現在、アプリケーションのさまざまなメソッドから定期的にこのメソッドを呼び出し、try - finally ブロック内でそれらを閉じています。これにより、使用後に接続が解放されるはずだと思いました。しかし、MySQL 管理者の [サーバー接続] タブで、多数の接続 (約 50) が開かれています。

//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 およびステートメント オブジェクトも閉じています。ここで何が欠けている可能性がありますか?

効率とセキュリティ上の理由から、すべてのステートメントを PreparedStatements に置き換えることを計画しています。それは大いに役立ちますか?他に何ができますか?

編集: これは、MySQL-JDBC コネクタを介して MySQL データベース内のいくつかのフィールドの変更を繰り返し照会する単なるコア Java アプリケーションです。Spring や Hibernate などのフレームワークは使用していません。

4

4 に答える 4

1

あなたのコードは正常に見えます。

それが新しい接続を作成する方法です。

おそらく、エラーは閉じた場所にあります。

最終ブロックで閉じる必要があります。

いくつかの追加の質問。

1) これらの 50 個の接続は、このプログラムからのものであると確信していますか? 同じオフィスから来ている人がいるかもしれません。これを確認するには、プログラムを停止し、接続モニターをもう一度確認する必要があります。

2) アプリケーションは多くの接続を同時に使用しますか? おそらく50個同時使用時がピークです。

接続を閉じるコードを投稿できる場合。問題がある可能性があります。

さらに、接続プールを使用することをお勧めします。自分で作成するか、このページから結果を確認できます。

Java での JDBC 接続の数は?

于 2009-01-28T18:54:04.980 に答える
0

J2EEアプリケーションサーバー内またはHibernateでJDBC接続を使用していますか?これらは両方とも、最初はかなり高い接続プールで始まる傾向があるため、多数が表示されます。

接続プールの詳細を確認してください。

于 2009-01-28T01:08:51.417 に答える
0

アプリケーションも閉じるときに接続オブジェクトを閉じていますか?

于 2009-01-28T00:51:23.090 に答える
0

問題に対してシングルトン アプローチを採用し、現在の Connection オブジェクトが null の場合にのみ新しい Connection オブジェクトを作成できます。

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

これにより、null 以外の接続が常に 1 つだけになるようになります。

于 2009-01-28T14:39:54.290 に答える