Mondrian OLAP连接管理

时间:2013-05-24 20:29:47

标签: scala playframework olap mondrian

管理Mondrian数据库连接的推荐模式是什么?

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

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
}

在finally块中调用close是否正确?

如何配置连接池?

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

1 个答案:

答案 0 :(得分: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()方法放在特征中,可以在类中混合使用。

至于连接池,有is another thread here

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