我正在使用Hibernate编写Java (注,而不是 Java )应用程序,我需要为每个执行线程提供到Hibernate的不同连接。必须将这些连接池化,并且每个连接至少具有不同的身份验证,可能还有不同的JDBC。连接将被重用(可以从池需求推断)。
我必须覆盖Hibernate/C3P0/等的哪些部分?这能用这些工具实现吗,还是我需要编写自己的池数据源?
发布于 2009-04-24 19:35:13
我认为最好的做法是为每个数据源创建一个SessionFactory,其中可能包含集合连接--这就是eqbridge在他的回答中所建议的。
现在,Hibernate确实有一个ConnectionProvider钩子,所以我想您可以编写一个实现,根据当前的执行线程和一些附加参数,将Connection返回到不同的数据源。理论上,您可以有一个SessionFactory实例,它将使用自定义ConnectionProvider实现提供的到不同数据库的不同连接。但是,一个SessionFactory保存了相当多的数据,当打开一个工作单元的Session时,Hibernate内部就会使用这些数据。另外,还有一个与其相关的二级缓存。
不幸的是,在面对这样一个供应商时,工厂和Session的开放行为是谁都猜不到的。对我来说,这就像是一次黑客攻击,我怀疑它是否被认为是SessionFactory的可行用例。它可能导致各种,可能是非常微妙的错误或数据损坏。
另外,一定要准确地度量创建多个SessionFactories的成本--它可能不像您想象的那么高。一定要将其与简单地打开所需的JDBC连接的成本进行比较。我不知道你会得到什么样的结果,但我认为你应该确定性能在你采取更多的黑客解决方案之前。
https://stackoverflow.com/questions/783773
复制相似问题