0

アプリケーションを起動するときに、内部データベースを次のようにテストします。

HibernateUtil.beginTransaction();

これはH2データベースです。私はc3p0プーリングでHibernateを上に使用しています。

問題は、トランザクションではないと判断するのに1分かかることです。10秒以内に再試行してください。c3p0プロパティを確認しましたが、これを行うものは何も表示されません。

*更新* コメントにより、HibernateUtil.beginTransaction()が私が行っていたことを隠していることに気づきました。

System.out.println("Get Session"+new Date());
Session session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
System.out.println("Get Txn"+new Date());
Transaction t = session.getTransaction();
System.out.println("Set Timeout"+new Date());
t.setTimeout(10);
System.out.println("Begin Txn"+new Date());
session.beginTransaction();
System.out.println("Commit"+new Date());
t.commit();

出力は

Get SessionWed Nov 21 12:15:56 GMT 2012
Get TxnWed Nov 21 12:16:27 GMT 2012
Set TimeoutWed Nov 21 12:16:27 GMT 2012
Begin TxnWed Nov 21 12:16:27 GMT 2012
FailedWed Nov 21 12:16:46 GMT 2012

したがって、セッションの取得に30秒(データベースが破損しているためにセッションを取得する方法が不明)に費やされ、その後19秒でトランザクションを開始しようとしているようです。

一方、データベースに問題がない場合、タイミングは数秒です

Get SessionWed Nov 21 12:23:57 GMT 2012
Get TxnWed Nov 21 12:23:59 GMT 2012
Set TimeoutWed Nov 21 12:23:59 GMT 2012
Begin TxnWed Nov 21 12:23:59 GMT 2012
CommitWed Nov 21 12:23:59 GMT 2012

したがって、主な問題は、dbが破損しているときに(ある種の)セッションを取得するのに長い時間がかかることであるように思われます

4

2 に答える 2

1

C3P0 を設定していないと思いますacquireRetryAttemptsが、デフォルト値である 30 回データベースに接続しようとします。この値を減らすと、はるかに速くなります。

また、調整したいオプションがあります:

  • acquireRetryDelay(デフォルト: 1秒)
  • breakAfterAcquireFailure(デフォルト: false)
于 2012-11-21T12:27:15.687 に答える
-1

これを試してください: HibernateUtil.getsessionfactory().opensession();

代わりに:HibernateUtil.getSession();

于 2012-11-21T12:32:18.200 に答える