2013-05-24 1 views
1

몬드리안 데이터베이스 연결을 관리하기 위해 권장되는 패턴은 무엇입니까?몬드리안 OLAP 연결 관리

저는 Scala/Play Framework 웹 응용 프로그램에서 몬드리안을 라이브러리로 사용하고 있습니다.

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 
} 

마침내 올바른 접근을 차단 A의 close를 호출 : 예를 들면?

연결 풀을 어떻게 구성합니까?

장기 실행 쿼리를 종료하는 데 권장되는 방법은 무엇입니까? 쿼리 진행 상황을 모니터링 할 수 있습니까?

답변

3

finally 블록에서 close()를 호출하면 연결이 실제로 닫히기 때문에 모든 리소스에 대해 올바른 작업을 수행 할 수 있습니다.

나는

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

VAR 제거하는처럼 작성합니다. 그러나 이것은 여전히 ​​"필수적 스타일", 그래서는 클러까지 코드를 시도/캐치를 제거하는

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

과 함께

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

을 사용합니다. 게다가, 당신은 닫는 것을 잊을 수 없습니다. 이것은 close() 메소드를 제공하는 모든 클래스에 적용 할 수 있습니다. withResource() 메서드를 특성에 넣으면 클래스에 혼합 할 수 있습니다.

연결 풀은 is another thread here입니다.

장기 실행 OLAP 쿼리의 경우 ... 오랫동안 실행하지 않는 것으로 간주됩니다. Essbase 또는 Palo의 경험에 따르면 이러한 쿼리는 "실시간"옆에 있음을 알 수 있습니다. 드릴 다운하는 경우 유일한 문제는 클라이언트로 전송되는 많은 양의 데이터 일 수 있습니다. 결과를 읽는 동안 들어오는 데이터를 진행 표시를 구현하는 수단으로 사용할 수 있습니다. OLAP 데이터베이스는 매우 빠릅니다. 어쨌든 코드를 비 블로킹 (non-blocking) 할 수 있도록 쿼리를 백그라운드 스레드에 넣을 수는 있지만 OLAP에서는이를 수행 할 필요가 없습니다. 가능한 한 빨리 프론트 엔드에 데이터를 파이프하면 클라이언트 (Excel 플러그인)가 작동하는 방식입니다.