2

練習のために、100 行程度からこれまでの簡単な JDBC をいくつか取得しましたが、型チェックは行いません。何か案は?より良いアプローチ?

def withResultSet[T](sql: String, f: ResultSet => T)(implicit info: ConnectionInfo): Try[T] = {
    for {
      conn <- Try(connect(info))
      stmt <- Try(conn.createStatement()) orElse { case err: SQLException => {conn.close(); err} }
      results <- Try(stmt.executeQuery(sql)) orElse { case err: SQLException => { conn.close(); stmt.close(); err }}
    } yield f(results)
  }

そして私のエラーは

 missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.util.Try[?]
      stmt <- Try(conn.createStatement()) orElse { case err: SQLException => {conn.close(); err} }
                                                 ^
4

3 に答える 3

3

Try不要になったリソースを処分するための適切なツールであるかどうかはわかりません。少なくとも私はそれを行うための明白な方法を見ることができません。https://github.com/jsuereth/scala-armを参照してください。次に、コードは次のようになります。

def withResultSet[T](sql: String, f: ResultSet => T)(
                     implicit info: ConnectionInfo): ManagedResource[T] = for {
  conn <- managed(connect(info))
  stmt <- managed(conn.createStatement()) 
  results <- managed(stmt.executeQuery(sql))
} yield f(results)

map または flatMap (または理解のために) を使用して他のリソースを操作し続けることができ、最後にそれからOptionまたはを取得Eitherし、同時に閉じる必要があるものをすべて閉じることができます。

于 2013-08-06T04:34:42.573 に答える
1

recoverWith私が必要としていたものです。実際に回復する必要はありません。単に再スローできます。

def withResultSet[T](sql: String, f: ResultSet => T)(implicit info: ConnectionInfo): Try[T] = {
    for {
      conn <- Try(connect(info))
      stmt <- Try(conn.createStatement()) recoverWith { case err => {conn.close(); Failure(err)} }
      results <- Try(stmt.executeQuery(sql)) recoverWith { case err => { conn.close(); stmt.close(); Failure(err) }}
    } yield f(results)
  }
于 2013-08-06T04:33:20.643 に答える