2017-11-26 20 views
2

다음 Play Slick DAO 클래스가 있습니다. 데이터베이스 구성은 상수 control0001입니다.Play Slick에서 동적으로 삽입 된 데이터베이스 이름 할당

class UsersDAO @Inject()(@NamedDatabase("control0001") 
    protected val dbConfigProvider: DatabaseConfigProvider) 
        extends HasDatabaseConfigProvider[JdbcProfile] { 

    import driver.api._ 

    def readUser (userid: String) = { 
     val users = TableQuery[UserDB] 
     val action = users.filter(_.userid === userid).result 
     val future = db.run(action.asTry) 
     future.map{ 
     case Success(s) => 
      if (s.length>0) 
      Some(s(0)) 
      else 
      None 
     case Failure(e) => throw new Exception ("Failure in readUser: " + e.getMessage) 
     } 
    } 
} 

@NamedDatabase("control0001") 대신에 상수를 갖는, I 가변 할 데이터베이스를 필요 다음 DAO는 사용자 ID에 기초하여 사용자를 읽는 기능 readUser있다. 이 응용 프로그램에서는 application.conf에 구성된 여러 데이터베이스 (control0001, control002 등등)가 있습니다. 변수 값에 따라 DAO에서 사용할 데이터베이스를 결정해야합니다. 모든 데이터베이스는 유사하며 동일한 테이블을 가지고 있습니다 (각 데이터베이스의 데이터가 다릅니다).

은 다음 재생 클래스는 DAO 함수를 호출하지만, 먼저 주입 할 데이터베이스 이름을 결정해야한다 : 이것은 재생 슬릭에

class TestSlick @Inject()(dao: UsersDAO) extends Controller { 

    def test(someCode: Int, userId: String) = Action { request => 

    val databaseName = if (someCode == 1) "control0001" else "control0002" 

    // Run the method in UsersDAO accessing the database set by databaseName 

    val future = dao.readUser(userId) 
    future.map { result => 
     result match { 
     case Some(user) => Ok(user.firstName) 
     case _ => Ok("user not found") 
     } 
    } 
    }   
} 

을 달성 할 수 있는가?

답변

1

당신은 기본 설정 무시 매끄러운 DB 개체를 초기화를 시도 할 수 있습니다 : 매끄러운 문서 http://slick.lightbend.com/doc/3.0.0/database.html

+0

내가 당신의 아이디어를 사용하여 결국, 대신 JDBC의 나는 JNDI 연결 : 컨트롤러에서 다음

class UsersDAO extends SlickComponents { def readUser(userid: String, dbName: String) = { val users = TableQuery[UserDB] val action = users.filter(_.userid === userid).result val dbConfig = slickApi.dbConfig(DbName(dbName)) val future = dbConfig.db.run(action.asTry) ... } } 

을 다음 SlickApi를 얻으려면 SlickComponents 특성에 섞는다. 연결을 사용하고 나면 연결을 끊어야합니까? – ps0604

+0

나는 그럴 수는 없지만, 유창한 플러그인을 사용하지 말고,이 예제를 확인하십시오. https://github.com/playframework/play-scala-isolated-slick-example – cutoffurmind

+0

JNDI 연결을 끊을 필요가있는 경우의 예 – ps0604

1

대신이 경우 Play의 런타임 의존성 주입 유틸리티를 사용하려고 시도의에서

val db = Database.forURL("jdbc:mysql://localhost/" + databaseName, driver="org.h2.Driver")

자세한 내용은 사용 SlickApi을 DAO에 직접 입력하고 데이터 소스 이름을 dbConfig(DbName(name)) 메소드로 전달하십시오.

def test(someCode: Int, userId: String) = Action { request => 

    val databaseName = if (someCode == 1) "control0001" else "control0002" 
    val future = dao.readUser(userId, databaseName) 
    ... 
}