当我启动我的应用程序时,我测试我的内部数据库是否正常,如下所示:
HibernateUtil.beginTransaction();
这是一个 H2 数据库。我在顶部使用 Hibernate 和 c3p0 池。
问题是需要一分钟才能确定它不能成为交易,我希望它在 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 秒来获取 Session(由于数据库已损坏,不清楚如何获取 Session),然后 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
所以主要问题似乎是当数据库损坏时(某种程度上)获得一个会话需要很长时间