Java 如何快速测试Hibernate数据库是否正常
启动应用程序时,我测试我的内部数据库是否正常,如下所示:Java 如何快速测试Hibernate数据库是否正常,java,database,hibernate,h2,c3p0,Java,Database,Hibernate,H2,C3p0,启动应用程序时,我测试我的内部数据库是否正常,如下所示: HibernateUtil.beginTransaction(); 这是一个H2数据库。我在上面使用Hibernate和c3p0池 麻烦的是,它需要一分钟才能确定它不能成为事务,我希望它在10秒内重试。我已经查看了c3p0属性,但看不到任何与此相关的内容 *更新* 该评论使我意识到HibernateUtil.beginTransaction()隐藏了我正在做的事情,并将其替换为: System.out.println("Get Sess
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秒来获取会话(不清楚数据库损坏时如何获取会话),然后花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配置收单机构尝试,它尝试连接数据库30次,这是默认值。减小此值,您将更快地获得它 此外,您可能还需要调整以下选项:
(默认值:1s)收单机构显示
(默认值:false)breakAfterAcquireFailure
代替:HibernateUtil.getSession() 这条线对你有帮助吗?thx有助于解决问题。我的HibernateUtil类中没有该类,但更改该类的目的是什么。我将“hibernate.c3p0.AcquisiteTryAttents”从30减少到10(因为我需要在实际正常使用应用程序时重试),这将超时时间减少到了一个更可接受的水平,虽然仍然超过10秒。