2011-04-08 3 views

답변

10

나는 대부분의 데이터베이스 API 년대 만 연결 수준에서 스레드 안전 것을 발견했다. Firebird는 다를 수 있지만 InterBase를 여러 번 사용하면 스레드로부터 안전하지 않습니다. 업데이트 : I have verified Firebird is only thread safe at the connection level.

이 일반적으로 동시에 하나 개 이상의 스레드에서 하나의 연결을 사용하지 않도록해야한다는 것을 의미합니다. 주어진 연결에 대한 쿼리의 실행이 적용됩니다. 동일한 연결에 대해 실행중인 다른 스레드에서 두 개의 쿼리가 발생하지 않도록하십시오.

그러나, 당신은 두 개의 연결이있는 경우 동시에 실행되는 두 개의 쿼리를 가질 수 있다고하는 데.

질문의 본질은 스레드에 안전한 방식으로 데이터를 전달하는 방법을 것 같다, 그리고 특정 필요가 데이터베이스가 있지만,이 관계없이 스레드에 포함 된 것의 일반적인 방식으로 적용됩니다.

데이터를 전달하는 가장 쉬운 방법은 창조에, 당신은 스레드 중단, 당신의 TThread 하위에 다양한 속성을 설정을 만들 수 있습니다. 그런 다음 스레드의 실행을 다시 시작하십시오. 스레드에서 작업을 수행하는 실제 코드는 Execute() 메서드에서 호출해야합니다.

당신이 그런 중요 섹션, 뮤텍스 또는 세마포 당신이 동기화를 허용하는 다양한 구조 중 하나에 포장해야한다 스레드간에 데이터를 공유해야하는 경우

.

델파이 SyncObjs.pas 유닛이 각 라이브러리 래퍼를 갖는다.

+0

+1 내 프로젝트 중 하나에 대해 광범위하게 사용하고 있습니다 (백그라운드 스레드 쿼리). 하지만 한 스레드에서 다음 스레드로 실제 쿼리 개체를 전달할 필요가 없으며 스레드 당 DbConnection + Transaction 쌍을 사용하고 있습니다. –

관련 문제