2014-10-02 5 views
1

FireDac과 HTTPServer 구성 요소를 사용하여 Delphi를 사용하여 웹 API를 작성했습니다.이 응용 프로그램은 파이어 버드 기반의 dbms를 사용하고 있습니다.FireDac 구성 요소 및 FireBird dbms를 사용하여 2 개의 트랜잭션이 열려있을 때 Delphi가 예외를 throw하지 않도록하려면 어떻게해야합니까?

동일한 API 끝점에 대한 여러 요청을 시뮬레이트하기 시작하기 전까지는 모든 것이 잘 작동했습니다. 이로 인해 이미 트랜잭션이 열렸을 때 두 번째 트랜잭션이 열리고 있음을보고하는 내부 서버 예외가 발생합니다.

메모리 누수를 방지하기 위해 모든 연결이 사용되고 닫히고 객체가 파괴된다는 것을 알고 있지만 왜 응용 프로그램이 예외를 트리거하는지 이해할 수 없습니다.

나를 도와 줄 수있는 도움이나 힘든 일이 있습니까?

+3

약간의 코드와 실제 오류가 포함 되십시오. –

답변

5

여러 요청이 HTTP 서버에서 동시에 처리됩니다.

두 클라이언트가 동시에 동일한 자원 (URL)에 액세스하려고하면 서버에 데이터베이스 연결과 데이터 액세스 구성 요소가 두 세트 필요합니다.

응용 프로그램이 클라이언트마다 다른 개체를 사용하고 스레드 안전 방법으로이 작업을 수행하는 경우 두 연결이 모두 올바르게 작동해야합니다.

들어오는 모든 HTTP 요청을 처리하기 위해 하나의 데이터 모듈 만 사용하는 경우 적절한 직렬화가 필요합니다. 사용 후 연결을 닫는 데 도움이되지 않으면 연결은 한 번에 하나의 스레드에서만 사용해야합니다.

오류의 잠재적 원인을 이해하려면 서버의 실제 설계에 대한 자세한 정보가 필요합니다.

+0

두 번째 단락에 제 문제가 있다고 생각합니다. 별도의 연결을 만들려고하지만 데이터베이스가 로컬이 아닌 경우 성능에 영향을 미칠 까봐 걱정됩니다. 나는 나중에 더 많은 정보를 가지고 돌아올 것이다. 고맙습니다. @mjn – Lothre1

+1

성능 문제에 관해서는 Classic vs Superserver 기사 (google for it)를 읽을 수 있습니다. – Wodzu

+0

[연결 풀] (http://docwiki.embarcadero.com/RADStudio/en/Multithreading_ (FireDAC) #Connection_Pooling)을 사용하여이 작업을 최적화 할 수 있습니다. – Victoria