2016-06-15 15 views
0

私は従来のJavaアプリケーションを使用しており、scalaでアプリケーションを拡張するときにデータベース接続処理を再利用したいと考えています。好きscalaでjava connectionpoolを再利用

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) 
     } 
    } 

とそれを呼び出す:

を私が試したScalaのコードで

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

既存のアプリケーションは、これは(のtry/catchを省略して)データベースを使用しません

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] 

私は何とかBoneCPたConnectionHandleからscalikejdbc互換性のある接続を得ることができることを前提と?

EDIT:ソリューションは、以下であることが最善の方法だろうDBs.setupAll()javax.sql.DataSourceインスタンスを経由してアクセスする。この特定のケース

答えて

1

には適用されませんapplication.conf、に依存しているため、DB readOnly etc.を使用すべきではないことに注意してください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()