【问题标题】:Using typesafe's config to manage my database connection使用 typesafe 的配置来管理我的数据库连接
【发布时间】:2013-09-11 05:01:51
【问题描述】:

这通常是一个直截了当的问题,但我不完全确定如何在 Scala 中解决这个问题,因为它是类型敏感的。我有一堂课,我在其中设置了与我的 MongoDB 实例的简单连接。现在在本地,我只是注释掉生产配置行并取消注释本地/开发行的糟糕想法。下面是每一个的样子:

// production
object MongoReplicaConnection {
    def mongoDb = {
      val addresses = List(new ServerAddress("10.1.1.2" , 27017),  new ServerAddress("10.1.1.3" , 27017),  new ServerAddress("10.1.1.4" , 27017))
      val mongoConn = MongoConnection(addresses) 
      val db = mongoConn("mydb")
      db
  }
}

// local development
object MongoReplicaConnection {
    def mongoDb = {
      val mongoConn = MongoConnection() 
      val db = mongoConn("mydb_local")
      db
    }
}

就获取传入的数据库名称而言,这很简单——它只是从配置文件中获取一个字符串。我想不出一个干净的解决方案的地方是如何处理我使用 ServerAddress 实例列表来初始化 MongoConnection() 而不是在本地/开发设置中将任何列表传递给 MongoConnection 的事实。

你如何在这里使用像 typesafe 的配置这样的工具?我假设我可以将一个空列表/数组传递给 MongoConnection() 用于本地数据库连接,但我不完全确定如何在不修改 mongoDb 函数的情况下配置生产数据库。我一直在寻找这样的工具来帮助我完成这个过程:https://github.com/typesafehub/config

【问题讨论】:

    标签: scala configuration scalatra typesafe


    【解决方案1】:

    您可以为此目的使用类型安全配置。
    您必须定义一个名为 application.conf 的文件,该文件应该存在于您的类路径中。
    类型安全配置通过读取 application.conf、reference.conf 等中定义的配置来工作。
    所以首先创建一个名为 application.conf 的文件,它应该在应用程序类路径中 并像这样定义配置值

    com.company.application {
      production {
        mongodb {
          servers=["10.1.1.2", "10.1.1.3"]
          password=pwd
        }
      }
      development {
        mongodb {
          servers=["10.1.1.2", "10.1.1.3"]
          password=pwd
        }
      }
      local {
        mongodb {
          servers=["127.0.0.1."]
          password=pwd
        } 
      }
    }
    

    读取值的代码如下所示

     import com.typesafe.config.ConfigFactory
     import com.typesafe.config.Config
    
     object MongoReplicaConnection {
    
     def mongoDb = {
    
       val configNamespace = "com.company.application"
       val mergedCfg = ConfigFactory.load().getConfig(configNamespace)
       val env = getEnvironment // a util function, returns development or productoin or local
       // environment can be passed as jvm args and read from System properties
       val envCfg = mergedCfg.getConfig(env)
       val serverCfg = envCfg.getConfig("mongodb")
       val servers = serverCfg.getStringList("servers")
       // Servers will be a returned as List of Strings
       val pwd = serverCfg.getString("password")
       val addresses = servers map { new ServerAddress(_ , 27017) }
       val mongoConn = MongoConnection(addresses) 
       val db = mongoConn("mydb")
       db
     }
    } 
    

    【讨论】:

    • 这是在正确的轨道上,但它不会起作用,因为您不能只将列表传递给 MongoConnection。它需要一个 ServerAddress 实例列表。
    • 我不确定我是否正确地满足了您的要求。我稍微修改了解决方案。您不能在配置文件中使用任何用户定义的类/类型。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多