我目前正在开发一个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:无法从底层数据库获取连接!
不幸的是,Spring 似乎并不真正关心。异常被记录下来,但 refresh()
完成并且不会因此抛出任何异常。我本来希望我可以简单地捕获异常,然后我就会知道连接失败。
我可以按计划进行选择,但我想尽可能限制连接尝试,因为数据库服务器在多次尝试后会阻止用户。即使是永久的,如果有很多尝试(在我更改连接池的设置之前,已经有一些乐趣了)。
我对这个问题的搜索几乎没有结果。有没有办法以某种方式获得异常?或者 Spring 是否提供了某种 API 来告诉我实例化/刷新期间的连接错误?
如果做不到这一点,有什么替代方法的想法吗?最好只需要一次尝试即可确定连接是否可行。
编辑:对于任何感兴趣的人:我采纳了 Santosh 的建议,并在 JDBC
中实现了连接测试。
不幸的是,似乎没有简单的方法来利用 bean 实例化过程中遇到的数据库错误/异常。
最佳答案
- 使用 spring+hibernate 来实现您正在寻找的功能类型将非常棘手。
- 连接属性在 session 工厂级别设置,如果凭据不正确,则不会实例化 session 工厂。
引用 @Bozo 的 answer here 。
What you can do is extend
LocalSessionFactoryBean
and override thegetObject()
method, and make it return a proxy (viajava.lang.reflect.Proxy
or CGLIB / javassist), in case the sessionFactory is null. That way aSessionFactory
will be injected. The proxy should hold a reference to a bareSessionFactory
, which would initially be null. Whenever the proxy is asked to connect, if the sessionFacotry is still null, you call thebuildSessionFactory()
(of theLocalSessionFactoryBean
) and delegate to it. Otherwise throw an exception. (Then of course map your new factory bean instead of the current)还有一种简单且基本的方法,其中在创建
ClassPathXmlApplicationContext
之前,只需尝试使用原始 JDBC 调用获取连接即可。如果成功,则继续,否则使用适当的消息。- 您可以在此处限制连接尝试,因为您拥有完全的控制权。
关于java - 使用 spring 和 hibernate 测试数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12245400/