2016-10-07 2 views
6

문제점 :com.mchange.v2.c3p0.ComboPooledDataSource에서 특정 연결을 요청하려면 어떻게해야합니까?

  • 프로그램베이스 서버에 연결 com.mchange.v2.c3p0.ComboPooledDataSource 사용
  • 프로그램 시퀀스에서 2 개 방법 runSQL1()runSQL2()을 실행
  • runSQL1()는 #temptable

    SELECT * INTO #myTemp FROM TABLE1 WHERE X=2 
    
  • 를 생성 SQL을 수행
  • runSQL2()은이 #tem에서 읽는 SQL을 실행합니다. ptable

    SELECT * FROM #myTemp WHERE Y=3 
    
  • 문제 : runSQL2()runSQL1()을 물려 것보다 풀에서 다른 DB 연결을 건네됩니다.

    그러나 Sybase #temptables는 연결에 따라 다르므로 테이블을 찾을 수 없으면 runSQL2()이 실패합니다. 내가 생각할 수있는

가장 확실한 해결책은 (옆으로 우리가 심지어 풀을 필요로하지 않는 점에서 풀 크기 (1) 만드는 퇴화 한에서) 어떻게 든이었다 특정되는 풀에서 연결을 기억하는 것입니다 runSQL1()에 의해 사용되며 runSQL2() 요청 같은 연결 있습니다.

com.mchange.v2.c3p0.ComboPooledDataSource에는이 방법이 있습니까?

가능하면 runSQL1()에 사용 된 연결이 다른 스레드에 의해 사용되는 경우 runSQL2()의 호출이 연결을 기다릴 때까지 기다릴 것입니다. 연결은 다른 스레드에 의해 해제됩니다).

그러나 불가능하다면 DB 연결 (내가 걱정하는 것)이 모든 단일 스레드에서 발생하므로 runSQL2()가 요청한 모든 연결이 100 %가 될 것이라고 가정합니다. SQL1()을 사용할 수 있었던 경우 사용 가능합니다.

해결 방법의 일부로 "#temptables 사용 중지"를 포함하지 않는 한 다른 방법으로 문제를 해결하는 모든 솔루션을 환영합니다.

+0

part1을 실행하기 전에 연결을 요청한 다음 두 호출에 매개 변수로 전달할 수없는 이유는 무엇입니까? – Ivan

+0

@ivan. 하지만이 솔루션을 좋아하지 않아 특정 연결을 얻는 방법을 알고 싶습니다. – DVK

+1

@Ivan이 제안한 솔루션이 적절한 솔루션이라고 생각합니다. 다른 방법으로 얻으려면 먼저 연결을 수신 할 때 연결 식별자를 보유해야합니다. 이 작업을 수행 한 후 풀 관리자에서 리플렉션을 사용하여 일치하는 연결을 찾아야합니다. 이를 수행하는 대신 특정 연결에 대한 참조를 유지하는 것이 더 깨끗합니다. 식별자로 질의하여 실제로이 작업을 수행해야하는 경우 자체 래퍼 연결 관리자를 작성하여 사용할 수 있습니다. – Kaan

답변

0

가장 쉽고 명확한 방법은 풀에서 연결을 요청한 다음 runSQL1()runSQL2()을 해당 연결로 실행하는 것입니다. 이 질문에서 제안 된 사용 패턴은 연결 풀 관리자의 일 반적인 설계 원칙에 위배됩니다. 연결 관리자가 일종의 트랜잭션 관리자를 효과적으로 홍보하기 때문입니다.

위와 관련하여 도움이되는 Java 프레임 워크가 있습니다. 예를 들어 Spring의 경우 @Transaction 또는 TransactionTemplate을 사용하여 트랜잭션 경계를 구분할 수 있으며 단일 스레드가 단일 스레드 (또는보다 정확하게는 트랜잭션 전파 주석에 따라)를 사용하도록 보장합니다. Spring은 많은 트랜잭션 관리자를 사용할 수 있지만 아마도 가장 단순한 것은 DataSourceTransactionManager이고 c3p0DataSource으로 사용하도록 구성 할 수 있습니다.

관련 문제