2010-03-24 4 views
3

BDE를 사용하여 SQL Server Native Client ODBC 드라이버 (2005 버전)를 통해 SQL Server 2008에 액세스하는 일부 Delphi 코드가 있습니다. 우리의 문제는 여러 테이블에 삽입하는 루프에서 교착 상태 문제가 발생한다는 것입니다.BDE, Delphi, ODBC, SQL 네이티브 클라이언트 및 데드락

전체 루프가 [TDatabase] .StartTransaction 내에서 수행됩니다. SQL Server Profiler를 보면 루프 중 한 지점에서 SPID (Session ID?)가 변경된 다음 자연스럽게 교착 상태가 발생한다는 것을 알 수 있습니다. 나는 BDE를 건너 사랑하지만 (두 SPID가 같은 테이블에 삽입을하고)

그것은 어떤 점에서 BDE 것 같아, 그것은 현재 가능한 DB에 두 번째 연결 ...

(아니다 않는다 .)

누구나 공유 할 수있는 경험이 있습니까?

+0

왜 ADO를 사용하지 않았습니까? –

+0

코드베이스가 약 13 살이며 BDE에 크게 의존하기 때문입니다. 우리는 Interbase와 MSSQL을 모두 지원해야합니다. – EspenS

+0

"스파이더 변경"이라고 말하면 조금 혼란 스럽습니다. 그건 아마 교착 상태의 원인입니다. 하나의 spid에서 트랜잭션을 시작하고 다른 트랜잭션에 삽입을 시도하거나 다른 트랜잭션에서 트랜잭션을 종료 할 수 없습니다. 어떻게 2 마리의 스파이더로 끝낼 지 알고 있니? 멀티 스레딩이 아니므로 두 번째 데이터베이스 연결을 만들 수 있습니까? –

답변

1

응용 프로그램이 다중 스레드 인 경우 : BDE는 스레드 세이프가 아닙니다. 각 스레드마다 별도의 BDE 세션 (명시 적으로 만들어진 인스턴스 TSession)을 사용해야합니다. 주 스레드에 대해 자동으로 생성 된 Session 전역이 충분하지 않습니다. 또한 모든 데이터베이스 액세스 구성 요소 (TDatabase, TQuery 등)는 TSession의 해당 인스턴스가 작성된 스레드 컨텍스트에서만 사용할 수 있습니다.

+0

응용 프로그램이 다중 스레드되지 않습니다. – EspenS

1

SQL Server 드라이버가 연결 풀링을 수행하도록 구성되어 있는지 ODBC 설치에서 확인하십시오. Native Client를 설치하면 기본으로 활성화됩니다. (적어도 광산 설치에는 연결 풀링이 활성화되어 있고 활성화하지 않았습니다.

0

이것은 아마도 구경꾼에게 너무 늦었지만 아마 다른 사람들에게 도움이 될 것입니다.

커서가 닫히지 않을 때마다 BDE/ODBC 콤보가 연속 쿼리에 대한 새 연결을 설정합니다. "스파이더 변경"은 닫히지 않은 커서의 결과 일 수 있습니다.

이 문제를 해결하려면이 stil-opened 커서를 발생시킨 BDE 구성 요소를 찾아야합니다. 그런 다음 결국 커서를 닫을 메서드를 호출합니다 (TTable.Close, TTable.Last ...).

"스파이더 변경"이 사라져야하므로 교착 상태가 발생해야합니다. 잠금 동안

  • (Management Studio를 사용 예) 다음 문을 실행합니다 :

    몇 가지 팁은 해당 구성 요소를 찾을 수 EXEC sp_who2을.

  • BlkBy에서 찾으십시오. 차단 된 연결에는 번호가 있습니다.
  • 이 번호는 차단 연결의 spid (서버 프로세스 ID)입니다.
  • 그런 다음 DBCC INPUTBUFFER(spid)을 실행합니다.
  • EventInfo 열에는 자신의 programm에서 발행 한 SQL 문을 찾을 수 있습니다.
  • 이 정보를 사용하면 문제를 일으키는 BDE 구성 요소를 찾을 수 있습니다.