0

当我启动我的应用程序时,我测试我的内部数据库是否正常,如下所示:

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

所以主要问题似乎是当数据库损坏时(某种程度上)获得一个会话需要很长时间

4

2 回答 2

1

我想您没有acquireRetryAttempts为您的 C3P0 进行配置,它尝试连接到数据库 30 次,这是默认值。减少这个值,你会更快地得到它。

还有一些您可能想要调整的选项:

  • acquireRetryDelay(默认:1s)
  • breakAfterAcquireFailure(默认:假)
于 2012-11-21T12:27:15.687 回答
-1

试试这个: HibernateUtil.getsessionfactory().opensession();

代替:HibernateUtil.getSession();

于 2012-11-21T12:32:18.200 回答