0

QueryRunner クラスで DbUtils ライブラリを使用してクエリを実行しています。私のDbUtilsドキュメントの理解から、接続を閉じることを心配する必要はありません。ただし、何らかの理由で、接続が自動的に、または手動で閉じられません。これが私のコードです:

 public static DataSource createDataSource() {
    BasicDataSource d = new BasicDataSource();
    d.setDriverClassName(Globals.getInstance().getKonfiguracija().dajPostavku("driver"));
    d.setUsername(Globals.getInstance().getKonfiguracija().dajPostavku("dbUsername"));
    d.setPassword(Globals.getInstance().getKonfiguracija().dajPostavku("dbPassword"));
    d.setUrl(Globals.getInstance().getKonfiguracija().dajPostavku("serverDatabase"));
    return d;
}

public static void insertSQL(String sql)
{
    DataSource dataSource = createDataSource();
    QueryRunner qr = new QueryRunner(dataSource);

    try {
        int inserts = qr.update(sql);
        qr.getDataSource().getConnection().close();

    } catch (SQLException ex) {
        Logger.getLogger(DBController.class.getName()).log(Level.SEVERE, null, ex);
    }

}

私は定期的にinsertSQLメソッドを呼び出すスレッドを持っているので、しばらくすると「接続が多すぎます」というエラーが発生します。Tomcatの最新バージョンを使用しており、データベースはMYSQLです。

4

1 に答える 1

2

DataSourceメソッドを呼び出すたびに新しいを作成していますinsertSQL()。これがおそらく例外の原因です。

代わりに、DataSource一度作成してからインスタンスをQueryRunnerコンストラクターに渡す必要があります。次に例を示します。

QueryRunner queryRunner = new QueryRunner(dataSource);

を使用するDataSourceと、通常、接続を手動で閉じる必要はありません。

その他の例については、 https://commons.apache.org/proper/commons-dbutils/examples.htmlを参照してください。

于 2016-06-11T14:06:19.747 に答える