我正在使用 Hibernate 编写 Java SE(注意,不是Java EE)应用程序,并且我需要为每个执行线程提供到 Hibernate 的不同连接。这些连接必须汇集在一起,并且每个连接至少具有不同的身份验证,并且可能具有不同的 JDBC URL。连接将被重新使用(可以从池化需求中推断出来)。
我必须覆盖 Hibernate/C3P0/et al 的哪些部分?这可以通过这些工具来完成,还是我需要编写自己的池数据源?
我正在使用 Hibernate 编写 Java SE(注意,不是Java EE)应用程序,并且我需要为每个执行线程提供到 Hibernate 的不同连接。这些连接必须汇集在一起,并且每个连接至少具有不同的身份验证,并且可能具有不同的 JDBC URL。连接将被重新使用(可以从池化需求中推断出来)。
我必须覆盖 Hibernate/C3P0/et al 的哪些部分?这可以通过这些工具来完成,还是我需要编写自己的池数据源?
您在这里有两个问题:
<property name="current\_session\_context\_class">线程</property>如果您在 hibernate.cfg.xml 中正确配置了线程池(使用 c3po 或您喜欢的任何池机制),那么每个线程都会从该池中获得一个连接。
总结(和概括),基本上 SessionFactory 本质上是围绕数据源(和伴随的连接池)的巨大包装器。它是只读的(因此是线程安全的)、重量级和静态的,一次构建,并且知道它需要的关于给定 DataSource 的一切。
另一方面,会话本质上是围绕连接的轻量级包装器。它不是线程安全的,通常是短暂的,并且打算使用然后丢弃。
希望这可以帮助!
我认为最好的做法是SessionFactory
为每个数据源创建一个,并可能使用池连接——这就是 eqbridges 在他的回答中所建议的。
现在,Hibernate 确实有一个ConnectionProvider
钩子,所以我想您可以编写一个实现,将Connection
s 返回到不同的数据源,具体取决于当前的执行线程和一些附加参数。理论上,您可以拥有一个SessionFactory
实例,该实例将使用与不同数据库的不同连接,由您的自定义ConnectionProvider
实现提供。但是,一个人SessionFactory
拥有相当多的数据,然后当为一个工作单元打开 a 时,这些数据会被 Hibernate 在内部使用Session
。另外,还有一个与之相关的二级缓存。
不幸的是,Session
任何人都在猜测,面对这样的供应商,工厂和您从中打开的工厂将如何表现。这对我来说就像是一种黑客行为,我怀疑它曾经被认为是一个可行的SessionFactory
. 它可能会导致各种可能非常微妙的错误或数据损坏。
另一方面,一定要准确衡量创建多个的成本SessionFactories
——它可能没有你想象的那么高。请务必将其与仅打开所需 JDBC 连接的成本进行比较。我不知道你可能会得到什么样的结果,但我认为你应该先确定性能,然后再求助于更骇人听闻的解决方案。