1

管理蒙德里安数据库连接的推荐模式是什么?

我在 Scala/Play Framework Web 应用程序中使用 Mondrian 作为库。例如:

var connection
try {
  connection = DriverManager.getConnection(connection_string).unwrap(classOf[OlapConnection])
  val result = connection.createStatement.executeOlapQuery(mdx)
  // ... use the result ...
} finally {
  if (connection) connection.close
}

调用closefinally 块是正确的方法吗?

如何配置连接池?

终止长时间运行的查询的推荐方法是什么?是否可以监控查询的进度?

4

1 回答 1

3

在 finally 块中调用 close() 可确保连接真正关闭,因此对于任何资源都是正确的做法。

我会这样写

val connection = DriverManager.getConnection(connection_string).unwrap(classOf[OlapConnection])
try {
    [...]
} finally {
    connection.close
}

摆脱var。但这仍然是“命令式”,所以我会使用

def withResource[T <: { def close() }, R](resource: T)(code: (T) => R): R = {
  try {
    code(resource)
  } finally {
    import scala.language.reflectiveCalls
    resource.close()
  }
}

和...一起

withResource(DriverManager.getConnection(...)) {
  conn =>
    [...]
}

摆脱使代码混乱的 try/catch。更重要的是,你不能忘记关闭。这适用于任何提供 close() 方法的类。如果你把 withResource() 方法放在一个特征中,你可以在你的类中混合它。

至于连接池,这里还有一个线程

至于长时间运行的 OLAP 查询……它们应该不会运行很长时间。使用 Essbase 或 Palo 的经验表明,这些查询接近于“实时”。如果您向下钻取,唯一的问题可能是要传输到客户端的大量数据。当您阅读结果时,您可以使用传入的数据作为实现进度显示的一种方式。OLAP 数据库非常快。无论如何,您可以将查询放在后台线程中,以便代码是非阻塞的,但是对于 OLAP 应该没有必要这样做。只需尽快将数据传输到您的前端,这就是客户端(Excel 插件)的工作方式。

于 2013-05-24T22:53:29.367 回答