3

Anorm フレームワークを使用した Scala の Play 2.0 は、データベースとやり取りするための 2 つの方法を提供します。

def withConnection[A](name: String)(block: Connection => A): A = {
    val connection = new AutoCleanConnection(getConnection(name))
    try {
      block(connection)
    } finally {
      connection.close()
    }
  }

  /**
   * Execute a block of code, in the scope of a JDBC transaction.
   * The connection and all created statements are automatically released.
   * The transaction is automatically committed, unless an exception occurs.
   *
   * @param name The datasource name.
   * @param block Code block to execute.
   */
  def withTransaction[A](name: String)(block: Connection => A): A = {
    withConnection(name) { connection =>
      try {
        connection.setAutoCommit(false)
        val r = block(connection)
        connection.commit()
        r
      } catch {
        case e => connection.rollback(); throw e
      }
    }
  }

withConnection が呼び出されるたびに接続を取得して閉じることは明らかです。

両方のメソッドが毎回接続を作成して閉じるのはなぜですか? それは高価なプロセスではありませんか?

4

1 に答える 1

2

ええと...接続プールから接続を取得できるので問題ありません。したがって、 close() メソッドは、実際に閉じられたのではなく、接続をプールに返すだけです。

于 2013-06-24T12:55:09.577 に答える