java - 在scala中重用java连接池

标签 java scala bonecp scalikejdbc

我有一个旧版 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");

我收到此错误(无论是数据库还是NamedDB版本)“连接池尚未初始化。(名称:'”,名称为default或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 连接句柄获得 scalikejdbc 兼容连接?

编辑:解决方案如下,请注意不应使用DB readOnly等,因为它依赖于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中重用java连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37831127/

相关文章:

带有 BoneCP STRANGE 错误的 Java 连接池

java - 组合使用 MySQL 和 BoneCP 时 jdbc executeBatch 挂起

java - 尝试使用 Web Harvest 从网站中提取 URL

java - 我如何知道curator InterProcessSemaphoreMutex丢失后是否被重新获取?

scala - 当特定类型的返回值未使用时,有没有办法获得警告/错误?

scala - 停止 Scala 2.11.4 REPL 中无限循环的执行?

java - 将准备好的语句与 BoneCP 结合使用

java - 非 Windows 中的 Appdata

java - 如何更改struts Action 类中声明的静态全局变量

debugging - Eclipse Scala 解释器 (REPL) - 正确使用和调试