1

我打算一次定义我的 Slick 查询并在需要时重用它们,但我遇到了 NullPointerException,我追踪到在同一个会话中使用了两次相同的 StaticQuery0 对象。Query 和 StaticQuery 对象是否意味着以这种方式重用?有没有更好的方法来解决这个问题(比如每次都创建一个新的查询对象?)或者我是否通过其他一些错误触发了异常?

以下是错误的详细信息。name.query 是通过 StaticQuery.queryNA 创建的 StaticQuery0。在不同的会话中重用它是有效的:

import Database.threadLocalSession
val points = db withSession {
  name.query.to[Vector]
}
val points2 = db withSession {
  name.query.to[Vector] // No problem!
}

在同一会话中再次使用它会引发 NullPointerException:

import Database.threadLocalSession
val points = db withSession {
  name.query.to[Vector]
  name.query.to[Vector] // Kablam!
}

这是一个例外:

java.lang.NullPointerException
    at com.mysql.jdbc.ConnectionImpl.initializeResultsMetadataFromCache(ConnectionImpl.java:5552)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1368)
    at scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:34)
    at scala.slick.jdbc.StatementInvoker.elementsTo(StatementInvoker.scala:17)
    at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:90)
    at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10)
    at scala.slick.jdbc.Invoker$class.build(Invoker.scala:66)
    at scala.slick.jdbc.StatementInvoker.build(StatementInvoker.scala:10)
    at scala.slick.jdbc.Invoker$class.to(Invoker.scala:74)
    at scala.slick.jdbc.StatementInvoker.to(StatementInvoker.scala:10)
    at scala.slick.jdbc.UnitInvoker$class.to(Invoker.scala:152)
    at scala.slick.jdbc.StaticQuery0.to(StaticQuery.scala:        
    at (the second call to name.query.to[Vector])
4

0 回答 0