使用 spring 和 hibernate 测试数据库连接

Posted

技术标签:

【中文标题】使用 spring 和 hibernate 测试数据库连接【英文标题】:Testing the database connection with spring and hibernate 【发布时间】:2012-09-03 09:42:06 【问题描述】:

我目前正在开发一个 java 应用程序。这是一个带有SpringHibernate 的独立客户端。还有C3P0。 在以前的版本中,我们使用标准用户(在配置文件中硬编码)进行数据库连接,但现在我们对其进行了更改,以便每个用户都必须提供自己的凭据。 带有数据库代码的bean基本上是按需创建的。 我更改了 XML 文件并添加了一个设置凭据以及一些连接设置的后处理器。现在看起来和这个差不多:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();

configurer = new PropertyPlaceholderConfigurer();

// properties are retrieved from a private method
configurer.setProperties(getProperties());

context.addBeanFactoryPostProcessor(configurer);

context.setConfigLocations(new String[]  "first.xml","second.xml" );

context.refresh();  

return context.getBean("myClass", MyClass.class);

这一切都按预期工作,但现在我们到达了我目前卡住的部分。 我想为连接提供测试功能,以便用户可以单击一个按钮,然后被告知他的凭据是否被接受。 我的第一个想法是在数据库上做一个简单的选择。然而,通过日志筛选,我注意到 Spring 在refresh()(或者更确切地说是 bean 的实例化)期间尝试连接到数据库。我可以在日志中看到异常,例如:java.sql.SQLException: Connections could not be acquired from the underlying database! 不幸的是,Spring 似乎并不真正关心。异常被记录下来,但refresh() 完成并且不会因此引发任何异常。我曾希望我可以简单地捕获异常,然后我就会知道连接失败了。 我可以按计划进行选择,但我想尽可能地限制连接尝试,因为数据库服务器会在多次尝试后阻止用户。即使有很多尝试(在我更改连接池的设置之前已经有一些乐趣)。 我对这个问题的搜索几乎一无所获。有没有办法以某种方式获得异常?或者 Spring 是否提供了某种 API 来告诉我实例化/刷新期间的连接错误? 如果做不到这一点,有什么替代方法的想法吗?最好只需要一次尝试即可确定连接是否可行。

编辑:对于任何感兴趣的人:我接受了 Santosh 的建议,并在 JDBC 中实施了连接测试。 不幸的是,似乎没有简单的方法来利用 bean 实例化期间遇到的数据库错误/异常。

【问题讨论】:

【参考方案1】:
    使用 spring+hibernate 来完成您正在寻找的功能将非常棘手。 连接属性在会话工厂级别设置,如果凭据不正确,则不会实例化会话工厂。

    从他的answer here 中引用@Bozo。

    您可以做的是扩展 LocalSessionFactoryBean 并覆盖 getObject() 方法,并使其返回一个代理(通过 java.lang.reflect.Proxy 或 CGLIB / javassist),以防万一 sessionFactory 为空。这样SessionFactory 就会被注入。 代理应该持有对裸 SessionFactory 的引用,它 最初将为空。每当要求代理连接时,如果 sessionFacotry 仍然为空,你调用buildSessionFactory()LocalSessionFactoryBean)并委托给它。否则抛出 一个例外。 (然后当然映射您的新工厂 bean 而不是 当前)

    还有一个简单且基本的方法,其中在创建ClassPathXmlApplicationContext 之前,只需尝试使用原始 JDBC 调用获取连接。如果成功,则继续,否则使用适当的消息。

    您可以在此处限制连接尝试,因为您可以完全控制。

【讨论】:

感谢您的回答。我已经考虑过使用纯 JDBC,这是我的备份计划。我希望(并且仍然希望)可能有一个更短、更优雅的解决方案。 这将需要一些额外的代码,因为连接参数不容易获得(凭据除外),而是存储在 XML 文件中。然而,这是真的,至少它可以让我完全控制。

以上是关于使用 spring 和 hibernate 测试数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 和 Hibernate 使用 Junit 测试 DAO 层和 Service 层的步骤

spring mvc+spring + hibernate 整合

在 Spring Boot 中使用 Hibernate 为 DAO 层配置单元测试

使用 JPA 和 Spring 加载选定的 Hibernate 实体

JUnit4、Spring、Hibernate 测试上下文设置

使用 H2 DB 进行 Spring/Hibernate 集成测试