私は完全に途方に暮れています.hibernateとmysqlの両方を使用してバッチジョブを実行しています.数時間後に、多くの接続を使用しているという例外が発生します. 私は SO に関するすべての記事を読みましたが、どれも私に関連しているようには見えません。私は非常に単純な構成で Tapestry-hibernate を使用していますhttp://tapestry.apache.org/using-tapestry-with-hibernate.html。アプリケーションが起動したら、休止状態のセッションをクラスに挿入するだけです。
これは、mysql との現在の接続ビューです。
私のバッチ ジョブはスレッド化されており、新しいスレッドが起動するたびに、threads_connected が増加しているように見えます。
私のcfg.xmlファイル。
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.datasource">jdbc/company</property>
<property name="hbm2ddl.auto">validate</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.search.default.directory_provider">filesystem</property>
<property name="hibernate.search.default.indexBase">/users/george/Documents/indexes </property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
</session-factory>
クラスでの基本的なセッションの使用例 - 「以下のコードは本番コードではなく、セッションの使用法を説明するために使用されていることに注意してください。
private final Session session;
public LineReaderParserImpl(Session session) {
this.session = session;
}
public void parse() {
exec.submit(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
Object object = session.createCriteria()...
session.save(object);
session.getTransaction().commit();
if (currentRow % 250 == 0 || currentRow == totalRows) {
try {
session.getTransaction().commit();
} catch (RuntimeException ex) {
try {
session.getTransaction().rollback();
} catch (RuntimeException rbe) {
throw ex;
} finally {
session.clear();
session.beginTransaction();
}
}
}
}
}
}