2013-01-07 3 views
2

사용자 입력을 처리하고 처리 한 다음 SQL 테이블에 레코드를 추가하는 웹 사이트가 있습니다.asp.net 프런트 엔드에서 SQL 레코드를 추가하는 가장 좋은 방법은 무엇입니까?

이번 주말에 SQL 서버가 작동되어 결국 사용자가 시간 초과 응답이있는 처리 시간이 길어지면서 문제가 발생했습니다. 그 위에 처리 된 데이터가 손실되었습니다.

궁극적으로 SQL이 다시 작동 할 때까지 어딘지에 저장된이 처리 된 데이터를 유지하고 레코드를 추가 할 수 있는지 궁금합니다.

웹 서비스에서이 작업을 수행 할 수 있다고 생각합니까? 아니면 뒤에 asp.net 코드에서 할 수 있습니까?

+3

하나의 옵션은 메시지 큐입니다 (예 : [MSMQ] (http://en.wikipedia.org/wiki/Microsoft_Message_Queuing)). 이들은 [WCF를 사용하여 소비 될 수 있습니다] (http://msdn.microsoft.com/en-us/library/ms789008.aspx) 좋은 것입니다. 본질적으로 MSMQ에 메시지를 보내고 나서 메시지를 데이터베이스로 처리 할 응용 프로그램에 도달하는지 확인해야합니다. 그러나 이것은 순간적이지 않기 때문에 실시간 시스템에서는 그렇게 좋지 않을 것입니다. –

+1

SQL 서버의 문제를 해결하는 것이 좋습니다. 그것이 정말로 중요한 경우, 일부 대체를 위해 서버를 클러스터링하는 것은 좋은 생각 일 수 있습니다. – Paddy

+0

다른 모든 방법이 실패하면 항상 SQL을 텍스트 파일로 덤프 할 수 있습니다. – Tim

답변

1

들어오는 팩스를 처리하고 데이터베이스에 저장하는 팩스 서버가있을 때이 시나리오를 잠시 다루었지만 데이터베이스는 신뢰성이 떨어졌습니다.

이 경우 SQL Server에 연결할 수 없으면 데이터를 디스크의 큐로 직렬화하고 SQL Server가 오프라인임을 나타내는 플래그를 응용 프로그램에 설정합니다. 후속 제출은이 플래그가 설정 될 때 디스크 대기열에 저장됩니다.

그런 다음 SQL Server가 정기적으로 백업되었는지 확인하고 대기 중이면 각 파일을 처리 한 다음 오프라인 플래그를 해제합니다.

ASP.Net에서 SQL Server가 오프라인 상태가되면 SQL Server를 모니터링하는 스레드를 시작하고 다시 온라인 상태가되면이 처리를 수행 할 수 있습니다.

그러나 설명이있는 경우 누군가 트랜잭션을 시작했지만 완료하지 않았거나 유지 관리 작업 (DBCC, 백업)이 발생하고있는 것 같습니다.

이런 일이 자주 발생하면 예상되는 정상적인 지속 시간 (예 : double)보다 약간 긴 CommandTimeout을 설정해야하며, 해당 작업이 해당 시간 프레임에서 완료되지 않으면 사용자에게 문제가 있거나 캐싱 모드로 들어갑니다.

관련 문제