如何通过hibernate一般性地测试数据库连接

时间:2012-01-13 19:50:47

标签: java hibernate jpa orm

我在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数据库。听起来这取决于供应商,所以我不确定它什么时候会起作用。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

这只是一个打包完全工作的Mysql服务器,它有一个用于star和stop的Java api,适用于大多数主要操作系统(win,lin,os x等)。这样你就可以让你的集成测试启动一个真正的Mysql服务器,并在那里尝试你的代码,其中诸如查询超时提示之类的东西可以正常工作。