如何在运行时更改Play 2 Framework DB配置?

时间:2013-04-18 16:29:45

标签: database configuration playframework playframework-2.0

我们正在使用Play 2.1.1及其内置的JPA集成(JPA.em() 等等)。

  • 我们如何动态更改db.pass属性? Play.application()。配置()似乎 从Play 2.1开始不变。 (或者我们至少不知道变异者)
  • 如果我们能够更改db.pass,我们如何重新加载数据库配置,以便JPA.em()使用新密码返回EntityManager?

我们要避免的是必须使用重新创建EntityManager EntityManagerFactory的。我们希望继续让Play管理它 JPA助手类。

背景

系统具有用于本地运行的默认数据库配置。部署到服务器时,使用以下脚本在正在运行的应用程序上动态设置DB密码:

#!/bin/bash 
stty -echo 
read -p "Password: " PASS 
stty echo 
curl -k https://127.0.0.1:8443/someUrl/pwd --data "password=$PASS" 

应用程序接收此数据,然后重新创建Hibernate SessionFactory的。我们的新Play应用程序将需要执行某些操作 类似。

2 个答案:

答案 0 :(得分:6)

关键是使用ConfigFactory创建新的Config条目。这个新配置包含一个密码条目,其值来自您对您的密码服务的http呼叫。

使用新配置创建新配置,新配置又从原始配置返回到原始配置。

基本上,新密码条目取代原始密码。

当你说出来时听起来很长,但代码很可读。

public class Global extends GlobalSettings {

    // inject http client to make call for password

    @Override
    public Configuration onLoadConfig(Configuration configuration, File file, ClassLoader classLoader) {
        final Config config = ConfigFactory.parseString(String.format("db.default.user=%s", callPasswordService()));

        return new Configuration(config.withFallback(configuration.getWrappedConfiguration().underlying()));
    }
}

答案 1 :(得分:2)

要回答我自己的问题,首先我们通过使用以下内容覆盖Configuration.onLoadConfig解决了在运行时更新不可变配置的问题:

  1. 如果配置表明production.level是PROD
  2. 从stdin
  3. 读取密码
  4. 通过将旧配置转换为地图并使用ConfigFactory.parseMap构建新配置来创建新配置,并使用新参数
  5. 返回super.onLoadConfig
  6. 但是,这仍然没有解决重新加载数据库配置的问题。最后,我的同事创造了一个Play!插件本质上是一些JPA类的副本,增加了重新加载配置属性Map的功能。

    <强>更新

    “hook”是插件添加到JPA类的附加静态方法(例如reloadWithProperties)。此方法创建一个新的数据源,然后在JNDI中反弹。