在Scala中保持全局应用程序状态的好策略是什么?

时间:2013-03-19 06:10:42

标签: scala slick

作为一个最简单的例子,假设我正在以某种模式(例如测试)启动我的应用程序,那么我希望能够检查应用程序的其他部分我正在运行的模式。这应该是非常的很简单,但我正在寻找适合全局变量的Scala替代品。请给我一点:“Scala对象就像全局变量”

理想的解决方案是,在启动时,应用程序将创建一个对象,并在创建时设置该对象的“模式”。之后,应用程序的其他部分将只能读取“模式”的状态。如何在不通过对整个应用程序的对象的引用的情况下执行此操作?

我的真实场景实际上包括诸如在启动时选择数据库名称或单例数据库对象,以及之后不允许任何其他内容更改该对象的内容。一个问题是我试图在不传递对数据库的引用的情况下实现这一目标。

更新

以下是我想要做的一个简单示例,以及我目前的解决方案:

object DB{
  class PDB extends ProductionDB
  class TDB extends TestComplianceDB
  lazy val pdb = new PDB
  lazy val tdb = new TDB
  def db = tdb //(or pdb) How can I set this once at initialisation?
}

所以,我创建了不同的数据库配置作为特征。根据我是在测试模式还是生产模式下运行,我想使用正确的配置,其中的配置如下所示:

trait TestDB extends DBConfig {
  val m = new Model("H2", new DAL(H2Driver),
    Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver"))

  // This is an in-memory database, so it will not yet exist.
  dblogger.info("Using TestDB")
  m.createDB
}

现在,每当我使用数据库时,我都可以这样使用它:

val m = DB.db.m
m.getEmployees(departmentId)

我的问题是,这种风格是坏的,好的还是好的(使用单例来保存数据库的句柄)。我正在使用Slick,我认为这与只有一个Slick运行实例有关。这是否会导致可扩展性问题。

有没有更好的方法来解决问题?

1 个答案:

答案 0 :(得分:4)

您可以使用typesafe config library,这也用于Play和Akka等项目。 Play和Akka文档都解释了它的基本部分。来自Play documentation (Additional configuration)

  

指定备用配置文件

     

默认是从类路径加载application.conf文件。如果需要,您可以指定备用配置文件:

     

使用-Dconfig.resource

     

-Dconfig.resource = prod.conf

     

使用-Dconfig.file

     

-Dconfig.file = /选择/ CONF / prod.conf

     

使用-Dconfig.url

     

-Dconfig.url = http://conf.mycompany.com/conf/prod.conf

     

请注意,您始终可以使用include指令在新的prod.conf文件中引用原始配置文件,例如:

     

include "application.conf"

     

key.to.override=blah