在 Spring Hibernate 中动态选择数据源 - 方法

Posted

技术标签:

【中文标题】在 Spring Hibernate 中动态选择数据源 - 方法【英文标题】:Dynamically selecting data sources in Spring Hibernate - approaches 【发布时间】:2015-06-17 17:32:30 【问题描述】:

是否有一种简单的方法可以通过使用 Spring 和 Hibernate 从 UI 或属性文件中读取来选择数据源,例如。数据源是 X 和 Y。?

一种方法是对会话工厂、数据源和事务管理器进行双重配置。然后,基于数据源的选择,DAO 被注入适当的 sessionfactory。有更好的选择吗?

我的情况是,当客户端需要更改同一应用程序的数据库时,我应该能够在两个数据库之间动态切换。

让 DAO 与 DB 兼容的方法是一种好方法吗?一种从 DB X 检索数据的方法和另一种从 DB Y 检索数据的方法,因为数据检索从一个 DB 到另一个 DB 不同,并在运行时动态调用这些方法。

为了数据库与 java 的兼容性,为 X 和 Y 数据库提供不同版本的相同应用程序是否更好?如果这是正确的方法,我想了解为什么?

【问题讨论】:

看看 Spring Profile。它应该会有所帮助。 感谢您帮助我选择一个选项,但我不喜欢 Spring 配置文件,因为我认为它与我的场景不完全匹配一个简单的解决方案。 【参考方案1】:

除了 Spring 配置文件,您还可以考虑 Spring 的 AbstractRoutingDataSource

一般的想法是路由DataSource充当中介 - 而“真实”数据源可以在运行时根据查找键动态确定。

您可以在此 blog 和较新的 post 中找到更多信息,这是 hibernate 的典型用法。

AbstractRoutingDataSource 易于使用,将支持您需要根据某些参数动态切换 DB 的场景。后面的帖子会为您提供一个示例,其中根据用户选择的语言环境进行动态切换

【讨论】:

谢谢。我认为 AbstractRoutingDataSource 很容易,例如当有相同类型的数据源时。甲骨文。但是如果我需要另一个数据库连接,例如 SQLSERVER,那么如果我为存储过程等设置一些参数,我将不得不在我的 DAO 层中进行更改,这可能因一个数据库而异。【参考方案2】:

我已经成功使用了选项一:属性文件,人们甚至可以自己更改它。如果你设法实现了一个行为相同的 Dao 接口的两个实现,那么就去做吧,我认为没有任何理由做两个不同的应用程序。

用值daoOracledaomysql 定义config.dao.id

<bean id='daoOracle' abstract='true' class='...'/>
<bean id='daoMySql' abstract='true' class='...'/>

<bean id='dao' parent='$config.dao.id'/>

<bean id='myService' class='...'>
   <property name='dao' ref='dao'>
</bean>

【讨论】:

可以通过属性文件查找连接,但是我没有找到让应用程序自动实现正确版本的DAO的方法。例如。如果我的属性文件配置了 Oracle 连接,我如何确保只执行与 Oracle 兼容的 DAO?有什么解决办法吗? “自动实现”还是“选择”?要“选择”,您需要一个标识实现的其他属性,然后创建一个别名并从服务中引用它。 如果我有 2 个用于 2 个不同数据库的 DAO,那么我的应用程序如何知道通过读取属性文件来选择其中一个。请详细说明如何使用别名从服务中引用它。我想我已经接近解决方案了..

以上是关于在 Spring Hibernate 中动态选择数据源 - 方法的主要内容,如果未能解决你的问题,请参考以下文章

带有注释和(动态)AbstractRoutingDataSource 的 Spring 3.1.3 + Hibernate 配置

在spring mvc中选择spring hibernate中的查询

动态数据源作为 Spring Boot + Hibernate 中的第二个数据源

spring hibernate实现动态替换表名(分表)

Spring with Hibernate-如何动态传递模式名称

Spring整合多数据源实现动态切换