私はしばらくの間ウェブを検索してきましたが、まだこの問題を修正していません:
次のデータソース構成があります。
<bean id="cpms.prod.ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost/mysql</value></property>
<property name="username"><value>test</value></property>
<property name="password"><value>test</value></property>
<property name="initialSize" value="1" />
<property name="maxActive" value="2" />
<property name="maxIdle" value="1"></property>
</bean>
これは、ある時点で 2 つのアクティブな接続のみが存在し、それらがプールに使用されることを確認するのに十分なはずです。
私のJavaコードSimpleJdbcTemplate
では、3つのクエリを実行するために使用しています。私が理解しているように、このオブジェクトは、各クエリが終了した後に接続をプールに返す必要があり、他のクエリの1つが終了する間、3番目のクエリもブロックする必要があります。
データベース管理コンソールを見ると、3 つの接続が表示され、スリープ状態に変わります。クエリを再度実行すると、別の 3 つの接続ポップアップが表示され、残りの 3 つはそこにとどまります。
接続を閉じるために私が見つけた唯一の方法は、次のように設定することです。
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="1"/>
<property name="minIdle" value="0"></property>
<property name="timeBetweenEvictionRunsMillis" value="1000"></property>
<property name="minEvictableIdleTimeMillis" value="1000"></property>
これにより、放棄された接続手順が強制的に実行され、古い接続が削除されます。
これらのパラメーターをいじる必要はありません。特に、パフォーマンスの問題が発生する可能性があるほど低く設定しないでください。
とをより低い値に変更するまで、ここに示す解決策を同じ効果で試しました。そして、それでも接続を 2 に制限しません。timeBetweenEvictionRunsMillis
minEvictableIdleTimeMillis