Mondrian OLAP 连接管理
Posted
技术标签:
【中文标题】Mondrian OLAP 连接管理【英文标题】:Mondrian OLAP connection management 【发布时间】:2013-05-24 20:29:46 【问题描述】:管理蒙德里安数据库连接的推荐模式是什么?
我在 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
在 finally 块中调用 close
是正确的方法吗?
如何配置连接池?
终止长时间运行的查询的推荐方法是什么?是否可以监控查询进度?
【问题讨论】:
【参考方案1】:在 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() 方法放在一个 trait 中,你可以在你的类中混合它。
至于连接池,有is another thread here。
至于长时间运行的 OLAP 查询......它们应该不会运行很长时间。使用 Essbase 或 Palo 的经验表明,这些查询接近于“实时”。如果您向下钻取,唯一的问题可能是要传输到客户端的大量数据。当您阅读结果时,您可以使用传入的数据作为实现进度显示的一种方式。 OLAP 数据库非常快。无论如何,您可以将查询放在后台线程中,以便代码是非阻塞的,但是对于 OLAP 应该没有必要这样做。只需尽快将数据传输到您的前端,这就是客户端(Excel 插件)的工作方式。
【讨论】:
以上是关于Mondrian OLAP 连接管理的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mondrian OLAP 中使用 DRILLTHROUGH?
mondrian.olap.ResourceLimitExceededException:蒙德里安错误:要读取的成员数超出限制(10,000)
如何从 Mondrian OlapConnection 获取 org.olap4j.metadata.Cube
Olap 异常 : Mondrian XML : : 没有函数匹配签名 'Exists(<Member>, <Set>)'