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

标签 java spring hibernate c3p0 applicationcontext

我目前正在开发一个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:无法从底层数据库获取连接!
不幸的是,Spring 似乎并不真正关心。异常被记录下来,但 refresh() 完成并且不会因此抛出任何异常。我本来希望我可以简单地捕获异常,然后我就会知道连接失败。

我可以按计划进行选择,但我想尽可能限制连接尝试,因为数据库服务器在多次尝试后会阻止用户。即使是永久的,如果有很多尝试(在我更改连接池的设置之前,已经有一些乐趣了)。

我对这个问题的搜索几乎没有结果。有没有办法以某种方式获得异常?或者 Spring 是否提供了某种 API 来告诉我实例化/刷新期间的连接错误?

如果做不到这一点,有什么替代方法的想法吗?最好只需要一次尝试即可确定连接是否可行。

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

最佳答案

  1. 使用 spring+hibernate 来实现您正在寻找的功能类型将非常棘手。
  2. 连接属性在 session 工厂级别设置,如果凭据不正确,则不会实例化 session 工厂。
  3. 引用 @Bozo 的 answer here

    What you can do is extend LocalSessionFactoryBean and override the getObject() method, and make it return a proxy (via java.lang.reflect.Proxy or CGLIB / javassist), in case the sessionFactory is null. That way a SessionFactory will be injected. The proxy should hold a reference to a bare SessionFactory, which would initially be null. Whenever the proxy is asked to connect, if the sessionFacotry is still null, you call the buildSessionFactory() (of the LocalSessionFactoryBean) and delegate to it. Otherwise throw an exception. (Then of course map your new factory bean instead of the current)

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

  5. 您可以在此处限制连接尝试,因为您拥有完全的控制权。

关于java - 使用 spring 和 hibernate 测试数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12245400/

相关文章:

java - 哪种 Spring 安全身份验证方案适合移动和 Web 应用程序的 REST API?

java - 针对接口(interface)的 Autowiring 返回 null - Spring MVC

java - 按字段选择 hibernate

java - 如何减少数据库连接失败的挂起时间

java - 如何在Spring中直接获取最高排序的bean而无需注入(inject)列表?

java - 如何将 "Optimizer hint"插入到 Hibernate 条件 api 查询

java - 构建一个匿名内部类并调用它的方法

java - Spring 3 with Tiles 2.2.2 - 获取 "Servlet spring is currently unavailable"

java - 关闭应用程序时如何保存 TextViews?

java - 使用 Jersey 测试 RESTful Web 服务时出现 HTTP 状态 404