2012-04-30 3 views
2

내 api 메소드 중 하나에서 데이터베이스에 작은 (그러나 빈번한) 조작을 수행해야합니다. 매번 "withSession"으로 그들을 래핑하려고하면 끔찍한 성능을 얻습니다.ScalaQuery에서 세션 재사용?

db withSession { 
    SomeTable.insert(a,b) 
} 

위의 예를 100 번 실행하면 22 초가 걸립니다. 단일 세션에서 이들을 모두 실행하는 것은 즉각적입니다.

이후의 함수 호출에서 세션을 다시 사용할 수 있습니까?

답변

3

당신은 연결의 일부 유형 풀링 (JDBC Connection Pooling: Connection Reuse? 참조)이 있습니까? 그렇지 않은 경우 모든 withSession (...)에 대해 새 연결을 사용하게되며 매우 느린 접근 방식입니다. ScalaQuery와 함께 C3PO를 사용하는 방법에 대한 설명은 http://groups.google.com/group/scalaquery/browse_thread/thread/9c32a2211aa8cea9을 참조하십시오.

응용 프로그램 서버의 관리되는 리소스를 사용하는 경우 일반적으로 "무료"로 표시되지만 독립 실행 형 서버 (예 : jetty)에서는 직접 구성해야합니다.

+0

연결 풀링이 없다고 생각합니다. 단지 메모리 내 hsql 데이터베이스에 액세스합니다. 그건 그렇고 - 그 연결에는 "만료"시간이 있습니까? 어쩌면 하나의 연결을 열어서 항상 열어 둘 수 있을까요? – Rogach

+0

100 초 삽입에 22 초를 사용하면 hsql 데이터베이스에 연결 인스턴스 생성에 엄청난 오버 헤드가 발생하는 것 같습니다. 만료 시간은 서버에 달려 있습니다. 이것은 종종 연결 풀의 문제점을 나타냅니다. 문제를 해결하는 한 가지 방법은 'select 1'과 같이 연결을 나눠주기 전에 테스트 쿼리를 실행하는 것입니다. – thoredge

1

아마 너무 확실한 방법을 명시하고 있습니다,하지만 당신은 단지처럼 withSession 블록 내에서 더 많은 통화를 둘 수 있었다 : 때

db withSession { 
    SomeTable.insert(a,b) 
    SomeOtherTable.insert(a,b) 
} 

는 다른 방법으로 당신이 당신의 사업을, 암시 적 세션을 생성 할 수있는, 닫습니다 당신은 완료 :

implicit val session = db.createSession 
SomeTable.insert(a,b) 
SomeOtherTable.insert(a,b) 
session.close 
+0

예, 정말 분명합니다. 나는 그들을 배치 할 수 없습니다. 뭔가를하기위한 요청은 데이터베이스 로직이 아닌 다른 데이터베이스 코드에서 비롯된 것입니다. 그러나 암시 적 세션을 사용하는 아이디어는 좋습니다. 한 세션을 열어 둘 수 있습니까? 얼마 후 죽지 않을까요? – Rogach

+0

HSQLDB 문서에서는 "사용자 로그인 및 로그 아웃 동작을 기록하는 응용 프로그램과 같이 멀티 스레드 및 트랜잭션이 아닌 응용 프로그램은 둘 이상의 연결이 필요하지 않습니다. 연결은 무기한 열어 둘 수 있으며 연결이 열린 상태에서만 다시 열 수 있습니다 네트워크 문제로 인해 떨어졌습니다. " 따라서 앱을 열어서 앱을 계속 사용할 수있는 것으로 보입니다. 여기에 다른 유용한 팁이 있습니다. http://hsqldb.org/doc/guide/deployment-chapt.html#dec_managing_connections – jxstanford