2011-02-24 2 views
2

나는 다양한 액티비티를 위해 2 개의 작업자 스레드로 넘겨지는 Connection 객체를 얻을 수있는 서블릿을 가지고있다. 이제 하나의 스레드에 트랜잭션을 추가해야합니다.스레드간에 공유 된 연결에 대한 JDBC 자동 커밋

이렇게 트랜잭션을 시작하면 connection.setAutoCommit (false);

두 스레드에 모두 영향을 줍니까? 나는 그렇게 생각한다.

각 스레드를 별도로 연결해야합니까?

덕분에

+0

JDBC 드라이버 매뉴얼에 명확하게 기술되어 있지 않으면 실제로 연결을 공유 할 수 없습니다. – bestsss

답변

1

내가 무슨 일을하는 것은 아주 나쁜 관행 생각합니다. 스레드간에 JDBC 연결을 공유 할 수 없습니다.

응용 프로그램 서버 (예 : TOMCAT/JBoss/WebSphere/WebLogic)에서 실행중인 경우 올바른 데이터 소스를 사용하여 필요에 따라 연결을 설정하십시오.

Application Server 설명서에서 방법을 확인하십시오.

당신은 당신의 서블릿에서 이런 일이있을 것이다 :

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
{ 
    Connection c = null; 
    try { 
     c = ...; /* preferred way of getting a connection in your AppServer 
     // do what you need with your JDBC connection 
    } catch (Exception e) { 
     // handle errors 
    } finally { 
     c.close(); /* you will need another TRY/CATCH here */ 
    } 
} 

가 마찬가지로, 당신의 작업자 스레드가 같은 것입니다 : 결국

public void run() 
{ 
    Connection c = null; 
    try { 
     c = ...; /* preferred way of getting a connection in your AppServer 
     // do what you need with your JDBC connection 
    } catch (Exception e) { 
     // handle errors 
    } finally { 
     c.close(); /* you will need another TRY/CATCH here */ 
    } 
} 

을, 당신은 별도의 원하는 영역 auto commit을 설정할 수 있습니다 연결 개체.

+1

당신은 절대적으로 옳습니다. 연결 공유의 의미를 고려하지 않았으므로 각 스레드가 자체 연결을 얻도록 조정하고 있습니다. –