2

私は完全に途方に暮れています.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();
                    }
                }
            }  
         }              
    }
}
4

2 に答える 2

-1

セッション オブジェクトがスレッド セーフではないことを考慮すると、注入されるセッション オブジェクトを定義する方法に問題がある可能性があります。

実装者がスレッドセーフであることは意図されていません。代わりに、各スレッド/トランザクションは、SessionFactory から独自のインスタンスを取得する必要があります。

于 2013-11-01T04:34:11.017 に答える