Tomcat WebアプリケーションにJDBCプールを使用しています。JDBCプール - 正しく使用する方法
私はdocsで読んだので、私は接続を取得し、クエリを実行して閉じる必要があります。 終了後、接続はプールに戻ります。
私は、クエリDBが外部イベントに依存し、毎5秒ごとに2つの正しい動作をするタスクの方が良いと思います。
誰かが5秒ごとに繰り返すタスクの使用方法を説明できますか?
PS:コードで余分なチェックをスキップして、コードを読みやすくします。
ウェイ#1は、プールからの接続と近い5秒毎
Connection c = null;
Statement s = null;
ResultSet rs = null;
DataSource ds = ... Get DataSource ...
while(running) {
try {
c = ds.getConnection();
s = c.createStatement();
rs = s.executeQuery('SELECT data FROM my_table');
... do something with result ...
} catch (SQLException sec) {
... print exception ...
} finally {
try {
rs.close();
s.close();
c.close();
} catch (SQLException sec) { ... print exception ... }
... Thread sleep 5 seconds and repeat ...
}
}
ウェイ#2ループ前に接続を取得し、クローズした後、ループ内で再接続
Connection c = null;
Statement s = null;
ResultSet rs = null;
DataSource ds = ... Get DataSource ...
c = ds.getConnection();
while(running) {
try {
s = c.createStatement();
rs = s.executeQuery('SELECT data FROM my_table');
... do something with result ...
} catch (SQLException sec) {
... print exception ...
... if connection lost, try reconnect and execute query again ...
} finally {
try {
rs.close();
s.close();
} catch (SQLException sec) {
... print exception ...
}
... Thread sleep 5 seconds and repeat ...
}
}
c.close();
プールの設定を取得します。
<Resource name="jdbc/pg_mega" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:6432/db"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
username="***" password="****"
defaultAutoCommit="true"
initialSize="1"
maxActive="300"
maxTotal="300"
maxIdle="20"
minIdle="5"
maxWait="10000"
validationQuery="select 1"
validationInterval="30000"
testWhileIdle="false"
testOnBorrow="true"
testOnReturn="false"
timeBetweenEvictionRunsMillis="30000"
minEvictableIdleTimeMillis="30000"
/>
大きなデータや非同期プロセスを処理しているのでなければ、なぜ私はスレッドアプリケーションをスリープ状態にしているのか分かりません。 2番目のアプローチはよさそうです。ループの各繰り返しで接続を取得する必要はありません。 – notionquest
統計情報を集めるBeanからのこのコード、Webアプリケーションの一部 – Dmitry
もう1つのオプションは、その目的のために1つの接続を完全に予約します。最初のスレッドは、そのスレッドがスレッドを使用していない間に、他のスレッドが接続を使用できるようにします。それはおそらく大きな違いはありません。あなたはwhile/sleepシステムの代わりに適切なスケジューラーを使うべきです。 – Kayaman