在以下许多查询的性能测试中,这个定时的JDBC代码需要500-600ms:
val ids = queryNA[String]("select id from account limit 1000").list
val stmt = session.conn.prepareStatement("select * from account where id = ?")
debug.time() {
for (id <- ids) {
stmt.setString(1, id)
stmt.executeQuery().next()
}
}
但是,使用ScalaQuery时,时间会转到&gt; 2s:
val ids = queryNA[String]("select id from account limit 1000").list
implicit val gr = GetResult(r => ())
val q = query[String,Unit]("select * from account where id = ?")
debug.time() {
for (id <- ids) {
q.first(id)
}
}
使用服务器日志进行调试后,原因是PreparedStatements正在重复准备而不能重复使用。
这实际上是我们在应用程序代码中遇到的一个性能问题,所以我们想知道我们是否遗漏了一些关于如何在ScalaQuery中正确重用预准备语句的问题,或者如果下载到JDBC是建议的解决方法。
答案 0 :(得分:1)
从scalaquery邮件列表中得到答案。这就是ScalaQuery的设计方式 - 它假设您提供了下面提供语句池的东西:
现在ScalaQuery总是从Connection请求一个新的PreparedStatement。在早期版本中曾经有一个PreparedStatements缓存,但我删除了它,因为已经有很好的解决方案来解决这个问题。每个体面的连接池都应该有PreparedStatement池的选项。如果您正在使用Java EE服务器,则它应该具有集成的连接池。对于独立应用程序,您可以使用http://sourceforge.net/projects/c3p0/
之类的内容