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 플러그인)가 작동하는 방식입니다.