如何使用持久性动态配置数据库连接
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。
【讨论】:
以上是关于如何使用持久性动态配置数据库连接的主要内容,如果未能解决你的问题,请参考以下文章