Повторное использование пула соединений Java в 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");

и я получаю эту ошибку (как с БД, так и с версией NamedDB) «Connection pool is not yet initialized.(name:'» с именем по умолчанию или с удаленной базой данных):

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?

РЕДАКТИРОВАТЬ: решение приведено ниже, обратите внимание, что DB readOnly etc. не следует использовать, поскольку оно зависит от DBs.setupAll() и application.conf, что не применяется в этом конкретном случае.


person FelixHJ    schedule 15.06.2016    source источник


Ответы (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()
person Kazuhiro Sera    schedule 15.06.2016