2017-12-20 68 views
0

ASP.NET 웹 응용 프로그램에서 ORM으로 Castle ActiveRecord를 사용하고 있습니다. 나는 그들의 SessionPerRequest 접근법을 사용하고 있으며 이것은 잘 동작한다. 그러나 데이터베이스 수준에서 오류가 발생하면 (즉, 항목을 삭제할 때 제약 조건 오류 또는 잘림 오류 (문자열 또는 이진 데이터가 잘릴 수 있음)) 오류가 발생한 후 실행되는 모든 쿼리에서 시간 초과가 계속 발생합니다. 이것은 약 10 분 동안 일어난다, 그 다음 모든 것이 다시 잘 움직인다. 나는 이것이 거래가 올바르게 닫히지 않는 것과 관련이 있다고 생각한다. 오류가 발생한 후에 트랜잭션을 올바르게 종료하는 방법을 찾을 수 없어서 이제는 효과를 최소화하려고합니다. 명령 시간 초과 및 연결 시간 초과를 더 작은 수로 설정하려고 시도했지만 작동하지 않는 것 같습니다. 아무도이 문제를 해결하는 방법을 알고 있습니까? 나는 당신의 상황을 이해할 수데이터베이스 예외 후 SQL 시간 초과

+0

그것은'SessionPerRequest' 전혀 잘 작동하지 않는 것이 분명합니다. 일단 데이터베이스에서 예외가 발생하면 세션은 쓸모가 없습니다. 그리고 세션 기간 동안 * 트랜잭션 *을 열어두면 심각한 버그가 발생합니다. 요청 당 세션은 EJB 및 Spring, * 세션 팩토리 *와 같은 * 응용 프로그램 컨테이너 *, 데이터베이스 연결 및 트랜잭션과 관련되지 않습니다. 트랜잭션을 오랫동안 열어두면 과도한 잠금, 차단, 시간 초과 등이 발생합니다. –

+1

BTW NHibernate는 결코 예외가 없었습니다. 데이터베이스 예외뿐만 아니라 예외가 발생할 경우 NH 세션이 유효하지 않습니다.A * database * 예외는 트랜잭션이 롤백되었고 연결이 닫혔다는 것을 의미합니다. 그러나 NH의 세션은 쓸모가 없으므로 버려 져야합니다. 원할 경우 * SessionFactory *를 캐시하십시오. 그러나 필요 이상으로 세션을 열어 두지 마십시오. –

답변

0

까지, 당신의 문제에 대한 두 가지 소스가 있습니다 :

1. 데이터 -베이스 - 서버 구성 당신은 우리에게 당신이 사용하는 느릅 나무 데이터베이스를 tould하지 않은, 그래서 나는 짐작할 수 있습니다. SQL 명령으로 인해 잠금이 발생하면 예외를 발생시킨 이전 명령을 기다릴 수 있으며 해결되지 않습니다 (일명 TimeOut). 트랜잭션이 로그 파일에 저장되면 로그 파일이 실제로 가득 찼을 가능성이 있으며 예외를 발생시킨 이전 명령 (즉, TimeOut)이 해결 될 때까지 향후 명령을 저장할 수 없습니다. uppon에 따라 데이터베이스 시스템에 따라 오류가 발생할 수있는 다른 이유가있을 수 있습니다. 순 서적으로 테스트하기 쉽고, 데이터베이스에 의해 발생 된 경우 SQL-command, NHibernate 및 데이터베이스 기반 전문가를 대상으로 새로운 요청을 시작할 수 있습니다. 데이터베이스 기반 구성 문제인 경우 테스트 방법은 무엇입니까? 단순한. 오류가 발생한 다음 관리 도구 (예 : MS SQL Server Management Studio, Oracle SQL Developer 등)를 사용하여 소프트웨어가 전송하는 것과 동일한 SQL 명령을 보내면됩니다. 관리 도구의이 명령에 소프트웨어와 동일한 문제점이있는 경우 데이터베이스 구성 문제이므로 데이터베이스 내에서만 복제하고 해결할 수 있어야합니다. 관리 도구의 명령 행이 시간 초과없이 해결되면 문제는 소프트웨어의 코드 또는 구성 내에 있습니다. SessionPerRequest가 작동하지

2. 나는 "약 10 분 동안 발생"당신은 10 분 동안 (약 라운드) 소프트웨어를 사용하지 후에도 문제가 중지한다는 것을 의미 있다고 생각한다. 또한 더 이상 중단하지 않고 브라우저에서 서버 (IIS)로 새 요청을 계속 보내면 문제가 10 분 이상 지속될 것으로 예상됩니다. 이것은 IIS 웹 세션이나 IIS 응용 프로그램 풀 (둘 다 소프트웨어에 의해 사용됨)이 시간 초과되고 모든 정적 변수, 모든 세션 변수 및 저장되는 모든 NHibernate 세션을 삭제하는 것을 의미합니다. 그곳에! 이 문제를 피하기 위해 SessionPerRequest 솔루션을 사용하려는 경우에는 직접 SessionPerRequest aproach를 구현해야합니다. ! 요청의 시작 부분에 새로운 NHibernate-session을 생성하고 요청의 끝에서 자신의 NHiberante-session을 삭제하는 코드가 애플리케이션에 있어야합니다. 이것은 NHibernate 자체로 코딩되지 않고 활성화 될 수 없습니다 모든 구성을 사용하여 직접 코딩해야합니다.

인사말 Juy Juka