예, 일반적으로 각 스레드에 대해 새 연결을 만들어야합니다. 운영 체제가 스레드 실행 시간을 어떻게 제어하는지 (자신의 중요한 섹션을 정의 함에도 불구하고) 실수로 여러 스레드가 하나의 파이프를 통해 데이터를 보내려고 할 수 있습니다.
모든 네트워크 통신에도 동일하게 적용됩니다. 예를 들어 두 개의 스레드가 하나의 소켓을 HTTP 연결로 공유하려고한다면.
- 스레드 1 스레드 2는 요청을
- 요청을하게
- 스레드 1은 당신의 모든 거래를 포장하는 경우 무의식적으로 스레드 2의 요청
의 응답을 읽고, 소켓에서 바이트를 읽어 중요한 섹션에서 전체 시작/커밋주기 동안 다른 스레드를 잠그면 스레드간에 데이터베이스 연결을 공유 할 수 있습니다. 하지만 JDBC 프로토콜에 대한 본래의 지식이 없으면 나는 그렇게하지 않을 것입니다.
대부분의 스레드에서 데이터베이스 연결이 자주 필요하지 않거나 전혀 필요하지 않은 경우 데이터베이스 작업을 수행 할 하나의 스레드를 지정하고 다른 스레드가 해당 스레드에 요청을 대기하게 할 수 있습니다. 이렇게하면 많은 연결의 오버 헤드를 줄일 수 있습니다. 그러나 환경에서 스레드 당 연결을 관리하는 방법을 알아야합니다 (또는 StackOverflow에서 다른 특정 질문을하십시오).
업데이트 : 대부분의 데이터베이스 브랜드는 단일 연결에서 여러 개의 동시 트랜잭션을 지원하지 않습니다.
별도의 트랜잭션 개체가 있고 연결 당 여러 트랜잭션을 시작하고 커밋 할 수 있으면 좋을 것입니다. 그러나 공급 업체는 단순히 지원하지 않습니다.
마찬가지로 JDBC 및 ODBC와 같은 표준 공급 업체 독립적 API는 트랜잭션 상태가 연결 개체의 속성 일뿐 아니라 동일한 가정을합니다.
Ok ... 호기심에 의해서만 트랜잭션 정의가 JDBC에서의 연결 정의와 결합 된 이유에 대해 알고 있습니까? 나는 정말로 거래 객체를 고맙게 생각한다. – fulmicoton
답변 해 주셔서 감사합니다. – fulmicoton
이 대답에서 "실수로 여러 스레드가 하나의 파이프로 데이터를 보내려고 할 수 있습니다"라는 문구는 postgresql에서 분명히 잘못되었습니다. http://doc.postgresintl.com/jdbc/ch10.html을 참조하십시오. 연결은 최소한 병렬 처리가되지는 않았지만 스레드로부터 안전합니다. –