使用 spring 和 hibernate 测试数据库连接
Posted
技术标签:
【中文标题】使用 spring 和 hibernate 测试数据库连接【英文标题】:Testing the database connection with spring and hibernate 【发布时间】:2012-09-03 09:42:06 【问题描述】:我目前正在开发一个 java 应用程序。这是一个带有Spring
和Hibernate
的独立客户端。还有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 实体