2016-06-15 4 views
0

У меня есть устаревшее приложение Java и я хотел бы повторно использовать его подключение к базе данных при расширении приложения с помощью scala.Reuse java connectionpool в scala

Существующее приложение делает это, чтобы использовать базу данных (с Try/задвижка опущена):

Connection dbConn = NewConnectionPool.getRemotePool().getConnection(); 
PreparedStatement ps = dbConn.prepareStatement(someQuery); 

в лестницу кода я попытался:

class Rules { 
    val connHandle = NewConnectionPool.getRemotePool.getConnection 
    val session = connHandle.unwrap(classOf[java.sql.Connection]) 
    def loadTagRulesFromDb(name: String = "rules"): tagRuleSet = { 
     //val tagRules = NamedDB('remotedb) readOnly { implicit session => 
     val tagRules = DB readOnly { implicit session => 
      sql"select * from databasename.messaging_routing_matchers".map(
      rs => tagRule(
       rs.long("id"), 
       rs.string("description"), 
       rs.long("ruleid"), 
       rs.string("operator"), 
       rs.string("target") 
      ) 
     ).list.apply 
     } 
     for (tr <- tagRules) { 
      println(tr) 
     } 
     tagRuleSet(name,DateTime.now(),tagRules) 
     } 
    } 

и называют это нравится:

Rules rr = new Rules(); 
rr.loadTagRulesFromDb("testing"); 

и я получаю эту ошибку (как с DB, так и с версией NamedDB) "Connection pool is not yet initialized.(name:'" с именем eit ее по умолчанию или remotedb):

java.lang.IllegalStateException: Connection pool is not yet initialized.(name:'default) 
    at scalikejdbc.ConnectionPool$$anonfun$get$1.apply(ConnectionPool.scala:76) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at scalikejdbc.ConnectionPool$$anonfun$get$1.apply(ConnectionPool.scala:74) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at scala.Option.getOrElse(Option.scala:121) ~[scala-library-2.11.8.jar:na] 
    at scalikejdbc.ConnectionPool$.get(ConnectionPool.scala:74) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at scalikejdbc.ConnectionPool$.apply(ConnectionPool.scala:65) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at scalikejdbc.DB$.connectionPool(DB.scala:151) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at scalikejdbc.DB$.readOnly(DB.scala:172) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2] 
    at dk.coolsms.smsc.Rules.loadTagRulesFromDb(Rules.scala:28) ~[smsc.jar:na] 
    at dk.coolsms.smsc.SendMessage.sendMessage(SendMessage.java:206) ~[smsc.jar:na] 

Я предполагаю, что я могу получить scalikejdbc совместимое соединение с BoneCP connectionHandle каким-то образом?

EDIT: решение ниже, обратите внимание, что DB readOnly etc. не следует использовать, поскольку она опирается на DBs.setupAll() и application.conf, который не применяется в данном конкретном случае

ответ

1

Доступ через javax.sql.DataSource экземпляр будет лучшим способом для интеграции ScalikeJDBC с существующими подключениями к базе данных.

http://scalikejdbc.org/documentation/connection-pool.html

Но у вас уже есть сырой java.sql.Connection, это также можно просто создать DBSession, как показано ниже:

implicit val session = DBSession(conn) 
sql"select * from databasename.messaging_routing_matchers".toMap.list.apply()