【问题标题】:How to change Play 2 Framework DB configuration at runtime?如何在运行时更改 Play 2 Framework DB 配置?
【发布时间】:2013-04-18 16:29:44
【问题描述】:

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

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

我们试图避免的是必须重新创建 EntityManager 使用 实体管理器工厂。我们希望继续让 Play 管理它 JPA 助手类。

背景

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

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

应用程序接收到这些数据,然后重新创建 Hibernate 会话工厂。我们的新 Play 应用需要做一些事情 相似的。

【问题讨论】:

    标签: database configuration playframework playframework-2.0


    【解决方案1】:

    关键是使用 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()));
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      1. 如果配置表明 production.level 是 PROD
      2. 从标准输入读取密码
      3. 通过将旧配置转换为地图并使用 ConfigFactory.parseMap 和新参数构建新配置来创建新配置
      4. 返回 super.onLoadConfig

      但是,这仍然没有解决重新加载数据库配置的问题。最后,我的同事创建了一个 Play!插件,它本质上是一些 JPA 类的副本,具有重新加载配置属性映射的附加功能。

      更新

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

      【讨论】:

      • 我正在尝试做类似的事情。你能否提供更多关于我可以挂钩的细节。我的插件似乎在执行 db 配置后运行。
      • @dom-farr 我添加了关于钩子的评论。
      • 谢谢。这将起作用。虽然我现在已经找到了那些讨厌的 mutators,所以我可以增加原来的配置。
      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多