2012-06-19 4 views
1

System.Data.SQLite을 사용하여 프로그램의 데이터 및 설정을 WPF 리본 응용 프로그램에 저장하고 있습니다.데이터베이스가 닫힌 후에 데이터베이스 쿼리가 실행됩니다.

프로그램을 열면 열 SQLite 데이터베이스를 선택하라는 메시지를 표시 한 다음 SQLite 데이터베이스의 설정 테이블에서 몇 가지 설정 (프로젝트 이름, 마지막으로 열었던 시간 등)을 읽습니다.
응용 프로그램이 닫히면 RibbonWindow.Closing 이벤트에서 SQLiteConnection.Close()이 호출됩니다.

사용자는 데이터베이스를 닫고 새 데이터베이스를 열 수도 있습니다.

이러한 이유로 설정이 프로젝트 정보보기에 표시되는 데 몇 초 정도 걸릴 수 있습니다. 이 과정에서 사용자가 응용 프로그램 닫기 버튼을 클릭하거나 프로젝트 파일을 닫아 다른 사람이 열 수있게하면 InvalidOperationExceptionDatabase is not open이라는 메시지가 표시됩니다.

프로그램을 닫을 때 모든 작업을 방해하는 가장 좋은 방법은 무엇입니까?

+0

상위 WPF 창에 대해 창 폐쇄 및 종료 이벤트를 사용하지 않는 이유가 무엇입니까? – Nate

+0

이것은 응용 프로그램의 수명 동안 SQLiteConnection을 열었 음을 의미합니다. 먼저이 문제를 해결하기 시작할 것입니다. – Steve

+0

@ 스티브 나는 이것이 왜 문제인지 이해할 수 없다. 프로그램의 거의 모든 단일 액션은 데이터베이스에 어떤 식 으로든 액세스하므로 전역 적으로 사용 가능한 연결을 갖는 것이 이치에 맞습니다. – yakatz

답변

2

SqlLite에서 연결 풀링을 설정하려면 pooling = true;을 연결 문자열에 넣습니다. 그것은 ADO.Net 시설이며 백엔드와 관련이 없습니다.

스레드에 연결을 전달하는 대신 연결 매개 변수를 전달하십시오. 그런 다음 각 스레드는 자체 연결을 관리합니다.

원하지 않는 경우 그런 다음 옵션이 있습니다.

스레드가 루프에서 완료 될 때까지 기다리십시오. 매우 짧지 않은 한 비트 쓰레기입니다.

나중에 다시 시도하십시오. Ho hum, 사용자는 앱에 3 개의 손가락으로 경례를주고 어쨌든 그것을 죽일 것입니다.

스레드를 죽입니다.

풀을 생성하여 풀링되지 않은 연결을 생성 한 다음 삭제하십시오. 주의 연결을 끊어 버리면 DBMS에 과부하를 걸 수 있습니다.

부울 속성을 추가하고 연결을 닫을 때 설정하십시오. 설정되지 않은 경우 연결을 닫지 마십시오.

그럼 연결 풀링을 시도해보십시오.

+0

풀링이 최상의 선택입니다. 감사. – yakatz

관련 문제