使用Hibernate在不同数据库中的2个表上进行连接
我需要在Hibernate中加入两个独立的Oracle数据库 (不是模式)中的两个表。 目前,我有两个Hibernate会话进入单独的数据库。 在任何人看到Hibernate Shards之前 ,我花了一天时间看着那个子项目并且发现:它是针对水平分区数据(所有表必须在所有数据库AFAIK中),有没有办法告诉Shards只能在一个数据库中查看( Hibernate Shards Docs ),而且不再使用它。
我曾想过试图解决这个问题的事情:
-
在两个表上执行
findAll()
或某些受限制的变体,并使用一些循环手动执行连接。 (适用于非常小的桌子 – 禁止从小桌子上来) -
让会话进行某种交互(我不知道这是否可行 – 将不得不查看Hibernate Session API)
-
从不同hibernate-xxxx.cfg.xml的URL字符串中删除数据库名称,并将它们插入到单独的hbm.xml文件中,如下所示:
(似乎没有从我最初的测试工作,这看起来像卡车大小的安全漏洞) -
使用存储库模式(如果我的Java-Fu足够强大,则不确定)
在上面的一个案例中是否有一些我忽略的东西,或者它是否是我未在上面列出的另一种方式?
不幸的是,你有几个问题。
- Hibernate不支持跨多个“物理”数据库实例加入
- 开箱即用,大多数数据库不支持跨多个“物理”数据库实例加入
从根本上说,DB在连接同一数据库中的表时只有良好/高效。 有两种方法可以跨数据库连接,但如果两个表的大小很大,这可能是一个问题,并且性能可能会受到影响。 做一些关于“跨越数据库的oracle连接”的谷歌搜索,你会发现一些关于如何做到这一点的指针,但它涉及摆弄Oracle创建从一个数据库到另一个数据库的虚拟链接。
我会考虑在内存中进行连接,如果您觉得数据集符合内存约束,那么您只能在一个特殊情况下执行此操作。
如果您需要在这两个数据库之间进行不同的连接,那么我会寻求更持久的解决方案,例如上面的Oracle链接。
我自己没有这方面的经验,但我知道Oracle支持两个独立数据库实例之间的数据库“链接”。 也许这篇文章会对你有帮助吗?
在Hibernate论坛上发布关于在两个实例之间使用Oracle链接的post