기본 스레드에서는 TAdsSettings 개체를 사용하고 다른 스레드에서는 AdsQuery 개체를 사용해도 안전합니까?

StackOverflow https://stackoverflow.com/questions/92848

문제

현재 ISAPI로 변환 중인 Win-CGI 응용 프로그램이 있습니다.

애플리케이션은 Extended Systems Advantage Database Server의 TDataset 하위 항목을 사용합니다.

tadssettings 객체의 인스턴스가 하나만있을 수 있으므로 주 스레드에 있어야합니다.

요청 스레드에는 TAdsQuery 객체가 필요합니다.

이 작동 - 즉, 요청 스레드의 광고가 기본 스레드의 Adssettings 객체에서 전역 설정을 선택하면 스레드가 안전할까요?

도움이 되었습니까?

해결책

예, 작동할 것입니다.TAdsSettings 구성 요소는 ACE(Advantage Client Engine)의 설정을 수정하며 ISAPI를 사용하면 모든 스레드가 사용하는 하나의 ACE 인스턴스가 로드됩니다.

그러나 나는 그것을 권장하지 않습니다.변경하는 설정에 따라 ACE API를 직접 호출하는 것이 더 합리적입니다.예를 들어 날짜 형식만 설정하는 경우 TAdsSettings 구성 요소를 제거하고 연결 핸들을 사용하는 AdsSetDateFormat60을 호출하는 것이 더 합리적입니다.TAdsSettings 구성 요소를 제거하면 ACE 전역 설정을 지정하기 위한 많은 호출이 제거됩니다.이러한 호출 중 다수에는 전역이 변경되는 동안 모든 연결을 보류하기 위한 동기화 개체가 있어야 합니다.이는 특히 웹 애플리케이션과 같은 다중 스레드 애플리케이션에서 성능에 부정적인 영향을 미칩니다.대신 지정된 연결 핸들에서 작동하는 호출을 수행하십시오.

TAdsConnection.Handle 속성을 참조하거나 TAdsQuery.GetAceConnectionHandle 메서드를 호출하여 연결 핸들을 가져올 수 있습니다.

다른 팁

AdsQueries가 기본 스레드에 없는 경우(예: System.MainThreadID <> Windows.GetCurrentThreadID)

나는 또한 뉴스 그룹에서 다음과 같은 질문을 했습니다.devzone.advantagedatabase.com, Advantage.Delphi

완전성을 기하기 위해 해당 스레드의 나머지 부분에 추가 질문/답변을 추가하겠습니다.

질문(나):

스레드의 많은 쿼리는 현재 Tadsconnection 객체에 첨부되지 않습니다.사용할 "Orphan"쿼리에 대한 각 스레드에 대한 연결을 만들 계획이지만 큰 응용 프로그램이므로 시간이 걸립니다.또한 Tadssettings 객체의 유일한 비 디폴트 속성은 서버 유형 세트이며 연결 구성 요소에서 설정할 수 있으므로 모든 쿼리가 연결에 연결되면 설정 구성 요소가 필요하지 않습니다.대안으로 설정 API를 직접 호출 할 것입니다.

그 동안 스레딩에 대한 질문과 연결 구성 요소가 할당되지 않은 쿼리에 대한 질문이 있습니다.Help 파일에서 여러 스레드의 쿼리가 단일 연결 객체를 공유하면 쿼리가 동시에 대신 직렬로 실행됩니다.각 스레드에 연결 객체를 사용하면 문제가되지 않아야하지만 쿼리에 대해 궁금합니다. ~ 아니다 연결 객체를 할당하십시오.그것들은 멀티 스레딩 동시성의 관점에서 독립적 인 연결로 간주됩니까, 아니면 동일한 연결에있는 것으로 간주되어 서로를 양보해야합니까?

답변(제레미):

이 문제를 해결해야 합니다.그들은 동일한 경로를 가진 글로벌 연결 목록을 검색하여 동일한 경로를 찾을 수 있으며 해당 연결을 사용합니다.다중 스레드 애플리케이션에서는 좋지 않습니다.

따라서 Jeremy의 답변에 따르면 각 스레드에 대해 하나 이상의 TAdsConnection 개체를 만들고 모든 쿼리가 여기에 연결되어 있는지 확인하는 것이 가장 좋습니다. 그렇지 않으면 직렬화가 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top