在 scala 中重用 java 连接池
Reuse java connectionpool in scala
我有一个遗留的 Java 应用程序,并且想在使用 scala 扩展应用程序时重用它的数据库连接处理。
现有应用程序执行此操作以使用数据库(省略 try/catch):
Connection dbConn = NewConnectionPool.getRemotePool().getConnection();
PreparedStatement ps = dbConn.prepareStatement(someQuery);
在我试过的 scala 代码中:
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:'
”,名称为 default 或 remotedb:
java.lang.IllegalStateException: Connection pool is not yet initialized.(name:'default)
at scalikejdbc.ConnectionPool$$anonfun$get.apply(ConnectionPool.scala:76) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2]
at scalikejdbc.ConnectionPool$$anonfun$get.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 兼容连接?
编辑:解决方案如下,请注意不应使用 DB readOnly etc.
,因为它依赖于 DBs.setupAll()
和 application.conf,这不适用于此特定情况
通过 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()
我有一个遗留的 Java 应用程序,并且想在使用 scala 扩展应用程序时重用它的数据库连接处理。
现有应用程序执行此操作以使用数据库(省略 try/catch):
Connection dbConn = NewConnectionPool.getRemotePool().getConnection();
PreparedStatement ps = dbConn.prepareStatement(someQuery);
在我试过的 scala 代码中:
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:'
”,名称为 default 或 remotedb:
java.lang.IllegalStateException: Connection pool is not yet initialized.(name:'default)
at scalikejdbc.ConnectionPool$$anonfun$get.apply(ConnectionPool.scala:76) ~[scalikejdbc-core_2.11-2.4.2.jar:2.4.2]
at scalikejdbc.ConnectionPool$$anonfun$get.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 兼容连接?
编辑:解决方案如下,请注意不应使用 DB readOnly etc.
,因为它依赖于 DBs.setupAll()
和 application.conf,这不适用于此特定情况
通过 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()