1

在以下许多查询的性能测试中,这段定时的 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 时,时间会超过 2 秒:

      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 解决方法。

4

1 回答 1

1

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

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

于 2011-07-20T04:21:56.060 回答