【问题标题】:How to generically test a database connection with hibernate如何使用休眠一般测试数据库连接
【发布时间】:2012-01-13 19:50:46
【问题描述】:

我在 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();

我的问题是 timeout 属性对我的 Sybase DB 有效,但对我的 HSQL DB 无效。听起来这取决于供应商,所以我不确定它什么时候可以工作。

有没有更好的方法来通用测试数据库连接并包含某种超时参数?

【问题讨论】:

    标签: java hibernate jpa orm


    【解决方案1】:

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

    然而,事情并没有那么严峻。一方面,即使你解决了这个问题,你仍然会偶然发现 HSQLDB 的其他问题,因为它不支持大多数数据库所具有的许多其他不错的功能。您应该只将 HSQLDB 用于基本集成/单元测试。对于更多涉及的测试,您可以使用集成的 MySQL Java 库。你可以在这里找到它:

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

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

    【讨论】:

    • 感谢您的解释。我担心可能是这种情况,但这对我来说不是主要问题。如果 Hibernate 用户有更好的方法来测试数据库连接,我很想听听。我不知道 MySQL Java 库 - 这很有趣,我会看看它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-02-02
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多