1

構成の詳細は次のとおりです。

<property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.Oracle9iDialect
    </prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.cache.provider_class">
     org.hibernate.cache.OSCacheProvider
    </prop>
    <prop key="hibernate.cache.use_second_level_cache">
     true
    </prop>
    <!-- <prop key="hibernate.hbm2ddl.auto">update</prop>-->
    <!-- HIBERNATE CONNECTION POOLING!!-->
    <prop key="c3p0.acquire_increment">5</prop>
    <prop key="c3p0.idle_test_period">100</prop>
    <!-- seconds -->    
    <prop key="c3p0.max_statements">5</prop>
    <prop key="c3p0.min_size">15</prop>
                            <prop key="c3p0.max_size">100</prop> 
    <prop key="c3p0.timeout">100</prop>
    <!-- seconds -->
   </props>
  </property>

私たちのアプリケーションはSpring&Hibernateを通じて開発されています。

アプリケーションを起動してヒットすると、140の接続が開き、解放されません。

DAOは次のようになります。

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
...
public class ActionDAO extends HibernateDaoSupport implements IActionDAO {
 public Action findById(ActionPK actionPK) {
  return (Action) getHibernateTemplate().get(Action.class, actionPK);
 }

 public void add(Action action) {
  getHibernateTemplate().save(action);
 }
}
4

6 に答える 6

2

しばらく前に同様の問題が発生しました。根本的な原因は、アプリが終了する前にHibernateセッションファクトリが閉じられなかったことです。これを自動的に処理するはずのSpringを使用していることは理解していますが、それでも確認する価値があるかもしれません。

于 2010-03-20T13:07:15.250 に答える
1

セッションはトランザクションの一部ですか? そうである場合、セッション/接続のクローズはトランザクションが終了したときにのみ発生する可能性があり、それが発生していない場合は、接続がリークされます。

org.hibernate.jdbc および org.hibernate.transaction でデバッグ ログを有効にすると役立つ場合があります... HibernateTemplate クラス (HibernateDaoSupport が使用する) を見て、セッションの作成/終了の構成方法のオプションを確認してください。DAO オブジェクトを Spring トランザクション ラッパーなどでラップしたいだけかもしれません。

于 2010-03-19T18:40:41.700 に答える
1

接続が 100 db を超えているため、c3p0 の設定がヒットしているとは思いません。そうは言っても、idle_test_period を c3p0 タイムアウト未満の値に設定する必要があります。

さらに、c3p0 が使用されていない理由を判断するには、どのバージョンの hibernate が重要になります。

春についても言及しました。トランザクションに関して何をしているのかを確認する必要があります。DAO の使用をトランザクションでラップしている、またはあなたのケースではラップしていない、ある種のサービスまたは何かがありますか?

于 2010-03-19T18:46:23.393 に答える
0

スプリング自動配線とhibernateTemplateを使用している場合

HibernateTemplateの複数のインスタンスを作成していないことを確認してください。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml");
Object o=context.getBean("hibernateTemplate");

オブジェクトoはどこかにキャッシュされ、アプリコードがhibernatetemplateのインスタンスを要求しているときに返される必要があります。

ありがとう

于 2011-06-21T14:04:41.930 に答える
0

最小サイズを削除して試してください: c3p0.min_size

于 2013-11-07T08:14:30.760 に答える
0

で同様の問題がありましたJboss-hibernateトランザクション セッションで読み取り操作を実行している間は、トランザクションをコミットする必要がないという印象を受けました。ただし、読み取り操作にすぎませんが、トランザクションをコミットする必要があることに気付きました (トランザクションを開始した場合)。どこでもトランザクションをコミットすると、リークはなくなりました。

バグのあるコードは次のようなものでした:

  1. 取引開始
  2. 読み取り操作の実行
  3. セッションを閉じる

上記を以下の手順に置き換えたら漏れはなくなりました。

  1. 取引開始
  2. 読み取り操作を実行する
  3. トランザクションをコミットする
  4. セッションを閉じる
于 2015-06-04T08:44:09.670 に答える