5

MySQLへの休止状態の接続が私のデータベースを閉じていません。10秒のように10回クリックした後、MySQL Workbenchからこの接続統計を取得します(開発マシン内。私が唯一のユーザーです)。MySQLWorkbenchサーバーのステータス

私はそれらを配置しています

  • C3P0と実行中(log4jからチェック、C3P0に関連する問題はなく、実行中のようです)
  • 開いているセッションがあるかどうかを確認し、requestDestroyed()メソッドで閉じるServletReqestListener。
  • Hibernate SessionオブジェクトはThreadLocalに保持されているため、すべてのリクエストには1つの接続しかなく、最初のクエリで開き、ServletRequestListenerで閉じます。
  • セッションを開いて閉じるたびに、コード例のように「SessionOpened」と「SessionClosed」をSystem.outに出力します。リクエストごと、ページの更新ごとに、「Session Opened」が表示され、「SessionClosed」の後にそれぞれ表示されます。だから私の小さなロジックは機能します。ただし、接続は閉じられません。

私のhibernate.cfg.xml

<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">officenic</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/officenic</property>
<property name="hibernate.connection.username">officenic</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

<!-- configuration pool via c3p0 -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds -->
<property name="hibernate.c3p0.max_size">5</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">100</property> <!-- seconds -->

セッションを閉じたいときに毎回呼び出すコードブロック。

if (session == null)
    return;

if (session.isOpen()) {

      if (session.isDirty())
         session.flush();

    session.close();
    System.out.println("Session closed");
}

私は何かが恋しいですか?

4

2 に答える 2

5

さて、私は毎回SessionFactoryを作成していたようです。ここのリンクには素晴らしいクラスがあり、SessionFactoryを静的にすることで問題が解決しました。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-firstapp-helpers

于 2012-03-24T15:49:21.260 に答える
1
private static final ThreadLocal<Session> session = new ThreadLocal<Session>();

public static void closeSession() throws HibernateException {
    Session s = session.get();
    if (s != null) {
        s.close();
        session.remove();
    }
}

実際、私はこのようにやっていて、それはうまくいきます

于 2012-03-18T04:50:11.893 に答える