1

我目前正在开发一个java应用程序。Spring它是一个带有and的独立客户端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 实例化期间遇到的数据库错误/异常。

4

1 回答 1

1
  1. 您正在寻找的那种功能使用 spring+hibernate 来完成是非常棘手的。
  2. 连接属性在会话工厂级别设置,如果凭据不正确,则不会实例化会话工厂。
  3. 从他的回答中引用@Bozo 。

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

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

  5. 您可以在此处限制连接尝试,因为您可以完全控制。
于 2012-09-03T10:53:17.267 回答