ScalaQuery的查询/查询比JDBC慢几倍?

时间:2011-07-17 22:52:35

标签: scalaquery

在以下许多查询的性能测试中,这个定时的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是建议的解决方法。

1 个答案:

答案 0 :(得分:1)

从scalaquery邮件列表中得到答案。这就是ScalaQuery的设计方式 - 它假设您提供了下面提供语句池的东西:

  

现在ScalaQuery总是从Connection请求一个新的PreparedStatement。在早期版本中曾经有一个PreparedStatements缓存,但我删除了它,因为已经有很好的解决方案来解决这个问题。每个体面的连接池都应该有PreparedStatement池的选项。如果您正在使用Java EE服务器,则它应该具有集成的连接池。对于独立应用程序,您可以使用http://sourceforge.net/projects/c3p0/

之类的内容