【发布时间】:2018-07-10 10:56:44
【问题描述】:
我有一段使用 DB 连接的 Scala 代码:
def getAllProviderCodes()(implicit conf : Configuration) : List[String] = {
var conn: java.sql.Connection = null
try {
conn = DriverManager.getConnection(DBInfo.dbUrl(conf), DBInfo.dbUserName(conf), DBInfo.dbPassword(conf))
return ResultSetIterator.create(
conn.prepareStatement("SELECT pcode FROM providers").executeQuery()
){_.getString("pcode")}.toList
} catch {
case e: Exception =>
logger.warn("Something went wrong with creating the connection: " + e.getStackTrace)
} finally {
if (conn != null) {
conn.close()
}
}
List()
}
这是非常类似于 OOP-Java 的风格,所以我想知道有没有办法以更实用的方式编写它?我试图成功应用Try monad,但失败了:我最担心的是我们这里有状态,还有finally 块。也许这种情况有某种模式?
提前谢谢你。
UPD: 以下是来自 here 的示例,恕我直言,解决方案的外观:
val connection = database.getConnection()
val data: Seq[Data] = Try{
val results = connection.query("select whatever")
results.map(convertToWhatIneed)
} recover {
case t: Throwable =>
Seq.empty[Data]
} get
connection.close()
但正如我在评论中提到的,我必须关闭连接,然后我必须将所有与连接有关的东西放在里面试着保持它的纯净......然后我用“try- catch-finally”在 Try 块中。
【问题讨论】:
-
您能否使用
scala.util.Try发布您的失败代码,以便我们帮助您查看哪里出错了? -
@JamesWhiteley 实际上我没有失败代码的示例,因为我只是在弄清楚如何实现它。我认为它应该类似于scalerablog.wordpress.com/2016/05/16/… 但是当我必须关闭连接时我被卡住了,然后明白所有与连接有关的东西都应该放在 Try... 然后返回变体“尝试-catch-finally”,仅在 Try 块内 :)
标签: scala functional-programming database-connection