管理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
}在最后阻塞中调用close是否是正确的方法?
如何配置连接池?
终止长期运行的查询的推荐方法是什么?是否可以监视查询的进度?
发布于 2013-05-24 22:53:29
在finally块中调用close()可以确保连接真的关闭,所以对任何资源都是正确的。
我会把它写成
val connection = DriverManager.getConnection(connection_string).unwrap(classOf[OlapConnection])
try {
[...]
} finally {
connection.close
}为了摆脱苦力。但这仍然是“祈使式”,所以我会用
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 =>
[...]
}为了摆脱试图/捕获,这会使您的代码混乱。更重要的是,你不能忘记关闭。这适用于提供close()方法的任何类。如果将withResource()方法放在一个特性中,则可以将其混合到类中。
至于连接池,则是is another thread here。
至于长期运行的OLAP查询..。他们应该不会跑很长时间。使用Essbase或Palo的经验表明,这些查询接近“实时”。如果您深入研究,唯一的问题可能是要传输到客户端的大量数据。在读取结果时,可以使用传入的数据作为实现进度显示的手段。OLAP数据库非常快。无论如何,您可以将查询放在后台线程中,这样代码是非阻塞的,但是不需要使用OLAP来执行。只要尽可能快地将数据导入前端,这就是客户端(Excel插件)的工作方式。
https://stackoverflow.com/questions/16743156
复制相似问题