【问题标题】:How to make Spring load a JDBC Driver BEFORE initializing Hibernate's SessionFactory?如何在初始化 Hibernate 的 SessionFactory 之前让 Spring 加载 JDBC 驱动程序?
【发布时间】:2010-05-11 15:04:22
【问题描述】:

我正在开发一个 Spring(2.5.6)+Hibernate(3.2.6) Web 应用程序来连接到自定义数据库。为此,我有自定义 JDBC 驱动程序和休眠方言。我确信这些自定义类可以工作(我的单元测试中的硬编码内容)。

我猜,问题在于 Spring 加载内容的顺序。 基本上:

  1. 自定义数据库初始化
  2. 从 web.xml 加载 bean
  3. Spring 加载 ServletBeans(applicationContext.xml)
  4. Hibernate 启动:显示正确加载的版本和所有属性。
  5. Hibernate 的 HbmBinder 运行(映射我的所有类)
  6. Lo​​calSessionFactoryBean - 构建新的 Hibernate SessionFactory
  7. DriverManagerConnectionProvider - 在 CustomDBURL 使用驱动程序:MyCustomJDBCDriver
  8. 我得到一个 SQLException:没有为 CustomDBURL 找到合适的驱动程序
  9. Hibernate 加载自定义方言
  10. 我的 CustomJDBCDriver 终于在 DriverManager 中注册(日志消息)
  11. SettingsFactory 运行
  12. SchemaExport 运行 (hbm2ddl)
  13. 我得到一个 SQLException:没有为 CustomDBURL 找到合适的驱动程序(再次?!)
  14. 应用程序已成功部署,但我的自定义数据库中没有表。

到目前为止我尝试过的事情:

  • 传递休眠属性的不同技术:嵌入在“sessionFactory”bean 中,从 hibernate.properties 文件加载。没有任何效果,但我还没有尝试使用 hibernate.cfg.xml 文件,也没有使用 dataSource bean。
  • MyCustomJDBCDriver 有一个静态初始化程序块,可将它自己注册到 DriverManager。
  • 尝试了 Spring bean 的延迟初始化 (lazy-init="true") 的不同组合,但没有任何效果。

我的自定义 JDBC 驱动程序应该是第一个加载的东西 - 不确定是否由 Spring 但是......!

谁能给我一个解决方案或者提示我可以尝试什么?如果有帮助,我可以提供更多详细信息(例如巨大的堆栈跟踪)。

提前致谢。

【问题讨论】:

  • 您在哪个环境中看到了这个问题?春季上下文感知单元测试? jboss 部署? (这可能是一个类加载器问题:例如,您是否使用了 jboss 发行版,该发行版在 servers/ctxt/lib 中包含 hibernate 并且驱动程序库在您的战争中?)
  • 您好 Thierry,我正在尝试将应用程序部署在本地 Jetty 服务器中进行测试。实际上,比这更复杂一点:Jetty 在一个处理单元(PU)的容器内运行。因此,PU 启动比它创建和启动 Jetty 容器。 Jetty 完成其余的工作(WebAppContext 稍后在 PU 中注册)。如何跟踪我的 CustomJDBCDriver 正在加载哪个类加载器以及 Spring 是哪个类加载器?谢谢!
  • 我的一位同事终于为我找到了解决方案。正如@Thierry 提到的,这是一个类加载器问题。我正在使用 Spring 库部署我的应用程序,但处理单元已经加载了那些(Jetty 的 lib 文件夹)。所以他们发生了冲突。我找到的解决方案是将我的 CustomJDBCDriver.jar 放在 Spring jar 所在的同一文件夹中(jetty lib 文件夹或来自应用程序 /WEB-INF/lib),并确保只有一个。就是这样!谢谢大家!

标签: hibernate spring loading jdbc


【解决方案1】:

如果 Hibernate 负责获取数据库连接,那么 hibernate 属性 needs to include hibernate.connection.driver_class 属性。

在你的情况下:

hibernate.connection.driver_class = CustomJDBCDriver 

【讨论】:

  • 嗨 skaffman,我已经完全按照您所说的方式包含了 driver_class - 我可以看到它已加载到 Hibernate 日志中 - 并且驱动程序已加载并在 DriverManager 中注册。所以这还不是我问题的答案。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2011-08-24
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多