如何快速测试休眠数据库是否正常



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

HibernateUtil.beginTransaction();

这是一个 H2 数据库。我正在使用带有 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 秒来获取会话(不清楚它如何获得会话,因为数据库已损坏),然后 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

所以主要问题似乎是,当数据库损坏时,(有点)获得会话需要很长时间

我想您没有为 C3P0 配置acquireRetryAttempts,它会尝试连接到数据库 30 次,这是默认值。减小此值,您将获得更快的速度。

此外,您可能还希望调整一些选项:

  • acquireRetryDelay(默认值:1 秒)
  • breakAfterAcquireFailure(默认值:假)

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

代替:HibernateUtil.getSession();

相关内容

最新更新