2012-01-13 76 views
2

我有一个服务方法的API可以被调用来检查我的数据库连接的健康状况。如何一般测试与休眠数据库连接

该方法从属性文件中提取查询字符串(取决于数据库供应商,现在使用Sybase和HSQL,将来会更多),并执行它。然后该方法让调用者知道它是成功还是失败。

除了这个,我用的是Query.setHint("javax.persistence.query.timeout")设置超时的查询:

javax.persistence.EntityManager entityManager; 
... 
Query heartbeatQuery = entityManager.createNativeQuery(heartbeatQueryString); 
heartbeatQuery.setHint("javax.persistence.query.timeout", heartbeatTimeout); 
heartbeatQuery.getResultList(); 

我的问题是超时属性正在对我的Sybase数据库,但不反对我的HSQL DB。这听起来像取决于供应商,所以我不知道它何时能够工作。

有没有更好的方法来一般测试数据库连接&包括某种超时参数?

回答

0

好可悲没有。 JPA的查询提示不是强制性的,即由实现者(EclipseLink,Hibernate等)执行或不执行。此外,即使实现者确实选择了识别某个查询提示,但如果该提示的功能不被数据库支持,那么它将不起作用(这里有些实现者很好,并告诉你某个提示是否会失效)当前数据库,而其他人默默地失败)。在HSQLDB的情况下,无法设置查询超时。您只能设置登录超时(即失败前应等待成功登录多久),而不是查询持续时间。

但事情并不那么严峻。一方面,即使你解决了这个问题,你仍然会遇到与HSQLDB有关的其他问题,因为它不支持大多数dbs拥有的许多其他很好的功能。您应该只使用HSQLDB进行基本的集成/单元测试。对于更多涉及的测试,您可以使用集成的MySQL Java库。你可以在这里找到它:

http://dev.mysql.com/doc/refman/5.0/en/connector-mxj.html

这是一个简单的包装完全工作MySQL服务器,这对明星Java API和停止,适用于大多数主流操作系统(赢,林,OS X等) 。这样你可以让你的集成测试启动一个真正的Mysql服务器,然后在那里尝试你的代码,查询超时提示等东西可以正常工作。

+0

谢谢你的解释。我担心可能会出现这种情况,但这对我来说并不是什么大问题。如果有更好的方式让Hibernate用户测试一个数据库连接,我会很有兴趣听到它。我不知道MySQL Java库 - 这很有趣,我会看看它。 – gregdferrell 2012-01-14 00:34:55