Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何快速测试Hibernate数据库是否正常_Java_Database_Hibernate_H2_C3p0 - Fatal编程技术网

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)
  • breakAfterAcquireFailure
    (默认值:false)

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


代替:HibernateUtil.getSession()

这条线对你有帮助吗?thx有助于解决问题。我的HibernateUtil类中没有该类,但更改该类的目的是什么。我将“hibernate.c3p0.AcquisiteTryAttents”从30减少到10(因为我需要在实际正常使用应用程序时重试),这将超时时间减少到了一个更可接受的水平,虽然仍然超过10秒。