如何使用持久性动态配置数据库连接

Posted

技术标签:

【中文标题】如何使用持久性动态配置数据库连接【英文标题】:how to configure database connection on the fly with persistence 【发布时间】:2016-07-07 16:57:09 【问题描述】:

我在 persistence.xml 中设置了数据库连接,包括服务器 url 和用户名/密码。但是,如果我想在开发环境(dev/qa/stg/prod)之间切换,是否有更好的方法来更改配置而不是手动修改persistence.xml?

我正在使用 jdbc 连接来调用存储过程和休眠的东西。 jdbc 连接更灵活。它根据环境变量 DEV_ENV 连接到不同的数据库。

// DEV DB
if (env.equalsIgnoreCase("dev")) 
    connectionURL = "jdbc:oracle:thin:@ldap://mdaoid.mdanderson.org:389/risdev3, cn=OracleContext,dc=mdacc,dc=tmc,dc=edu";
    user = "ristore_owner";
    pass = "ristoreowner987";

// QA DB
else if (env.equalsIgnoreCase("qa")) 
    connectionURL = "jdbc:oracle:thin:@ldap://mdaoid.mdanderson.org:389/risdev3, cn=OracleContext,dc=mdacc,dc=tmc,dc=edu";
    user = "ristore_owner_qa";
    pass = "ristore987q";

我如何以同样的方式配置休眠数据库连接,获取环境变量并即时决定连接到哪个数据库?

编辑:人们向我展示了如何通过从 tomcat 服务器获取数据库信息的战争来做到这一点。但是,我的是一个我不部署的 java 应用程序 (jar)。我将其设置为 cron 作业,以便每周运行 jar。

【问题讨论】:

为什么要手动修改persistence.xml?您可以拥有 2 个持久性单元“dev”和“prod”,并使用合适的方式创建 EMF @NeilStockton 没有考虑过使用单位。会试一试。我应该在哪里以及如何创建我的 EMF? 您现在在哪里以及如何创建 EMF?? @NeilStockton 抱歉,这是一个愚蠢的问题。我认为它应该工作。谢谢 【参考方案1】:

    创建两个 xml 配置文件。 persistenceDev.xml 和 persistenceQA.xml

    为每个环境添加 url、用户和密码。

    然后使用 SessionFactory 创建会话

注意:您唯一更改的是配置文件名。 我会提供一个命令行参数或一个静态最终变量。 比如说,假设 0 = dev,1 = qa。

String configFileName = (args[0] == 0) ? persistenceDev.xml: persistenceQA.xml;

获取配置文件后的代码不会改变。

【讨论】:

【参考方案2】:

我看到你以某种方式提供了环境。我的建议是使用构建工具(如 Maven、Gradle 等),通过它您可以将 UAT、Dev、Prod 等实际环境作为参数提供。

然后你可以有多个配置文件,如application-dev.xml、application-uat.xml。在构建期间,您使用构建工具加载适当的配置文件。

作为在 Maven 中执行此操作的参考,您可以查看 here。

【讨论】:

以上是关于如何使用持久性动态配置数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

Django 持久数据库连接

day66(YAML配置,使用Druid数据库连接池,编写持久层(数据访问层)代码,关于业务逻辑层(service层)

优秀的持久层框架-Mybatis框架解析

如何在 FastAPI 中进行持久数据库连接?

Mybatis

ActiveMQ 配置jdbc主从