如何快速测试Hibernate数据库是可以的

时间:2012-11-21 11:26:49

标签: java database hibernate h2 c3p0

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

HibernateUtil.beginTransaction();

这是一个H2数据库。我在c3p0池中使用Hibernate。

麻烦是一分钟决定它不能成为交易,我希望它能在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

所以主要的问题似乎是,当数据库损坏时需要很长时间才能获得一个会话

2 个答案:

答案 0 :(得分:1)

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

您也可以选择调整选项:

  • acquireRetryDelay(默认值:1s)
  • breakAfterAcquireFailure(默认值:false)

答案 1 :(得分:-1)

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

取代:HibernateUtil.getSession();