2011-09-08 35 views
20

これはクエリではありません。 SQLコンパクト・データベース・ファイルの破損の問題をほぼ完全に成功させるためのソリューションの概要です。 SQLCEの破損は非常に一般的な問題です。私たちはStackOverflowの以前の記事、そしてこの記事から多大な助けを受けました。SQL Server Compact Editionデータベースファイルの破損を解決します。

私たちの製品は、3層アーキテクチャで、Windowsサービスとして動作しているサーバーが.Net Remotingによってリッチクライアントに接続されています。私たちの製品は2006年からSQLCEを使用しています。我々はv3.1からv3.5に、そして現在v4.0に移行しました。非常に特殊な要件のためにカスタムORマッピングツールが用意されています。私たちはv3.1では限られた問題に直面してきましたが、v3.5とv4.0ではさらに問題がありました。

最初はv3.5でSqlCeEngine.Repairを実装しました。しかし、破損したデータだけを削除し、安定したdbを再作成しようとします。影響を受けたテーブルの外部キーが失われていることがわかりました。私たちはすぐにこれをやめなければなりませんでした。ユーザーにdb破損について通知し、最後のバックアップを復元し始めました。これは一時的な救済のみを提供しました。腐敗の問題はまだ立っていた。

今年はv4.0を採用しました。しかし、このアプリケーションでは、データベース呼び出しの数が大幅に増加したいくつかの新機能も導入されました。 v4.0はうまく始まりましたが、ソフトウェア使用量が増えたときに問題を提起し始めました。アプリケーションの実行中に発生した破損は、Windowsのクラッシュ、異常なシャットダウン、ディスクの問題のいずれによっても引き起こされませんでした。データベースが破損しました。

次のポストは、私たちがこの問題のために考案された解決策を説明します。

+0

あなたは問題をより詳細に記述してから解決策を答えに移すことができますか?ありがとう。 –

答えて

17

[クエリおよびソリューションを分離]

をここでは、問題を解決した方法を行く:

A)クロージング/廃棄接続/コマンド/トランザクションオブジェクト: 未使用のクローズされていない接続、トランザクション、またはコマンドオブジェクトがないことを確認しました。私たちのORMツールは、場合によってはアイドル状態になっていたトランザクションでコミットを呼び出した後に新しいオブジェクトを作成するために使用されました。これは腐敗の数を50%削減しました。

B)自動縮小を無効にする: アプリケーションが実行されている最中に、制御できなかった唯一の手順は自動縮小です。アプリケーションの起動時にSqlCeEngine.Compactを呼び出していました。我々は、圧縮と自動収縮の両方を廃止することに決めました。驚いたことに、私たちは腐敗をさらに48%削減しました。それは暗闇の中でのショットだったので、自動収縮がそのような問題を引き起こしたとは信じられませんでした。私たちはそのアップデートで問題を実際に解決しました。

C)同期データベーストランザクション: データベースの破損がまだ発生しています。明確な理由が検出されなかったため、データベーストランザクションを同期させることにしました。私は多くのデータベースの人々がこれを気に入らないことを知っています。私はそれも好きではない。一度に1つの呼び出しでデータベースを変更するように、中間層にロックを導入しました。当社の最大の実装は、当社のシステムを同時に使用する55人のクライアントです。データベース呼び出しを同期させると、目に見えるパフォーマンスの遅延はほとんどありませんでした。むしろ、SynchronizingはSqlCeEngine.Compactへのタイマードリブンコールを定期的に実装することを可能にしました。私たちは、コンパクトは犯人ではないことを知っていました。私たちは、コンパイルがdbを再インデクシングするときに必要な呼び出しであると感じました(私たちのソリューションは、多くの挿入と削除を行います)。ただし、排他的に機能する必要があります。コンパクトを呼び出すとデータベース呼び出しがありません。同期化により、アプリケーションの実行中に同期を制御することができました。これまで行ってきたので、データベースの破損の問題は一度も発生していません。それは今一ヶ月以上続いています。 1週間にほぼ5人のクライアントから、1ヶ月でゼロになります。

アイデアBとCにつながった基本的な推論は、SQLCEが組み込みデータベースであることです。破損はすべての組み込みデータベースソリューションに共通しています。本格的なデータベースソリューションは、接続やその他のタスクを管理する24時間365日のdb-serverによって独立して動作します。組み込みデータベースシステムには、このようなサポートシステムはありません。それが生きている唯一の段階は、接続が開かれたときです。

いくつかのポインタ:1)CommitMode.Immediateでcommitを実装します。これにより、Flush-Intervalプロパティが冗長化されます。 2)AutoShrinkが100に設定されているため、プロシージャーが完全に無効になります。3)同期化されたデータベース呼び出しを円滑に機能させるためにConnectionタイムアウトを増やしました。 4)アプリケーションの起動時にCompactが呼び出されます。クライアントがマシンをまったくシャットダウンしない場合は、24時間ごとにCompactにコールするタイマーを実装しました。

この投稿は問題を解決するのに役立ちます。

+0

この詳細なポストをありがとう。私も同様の状況にあります。 SQL CEの私の最初の実装は開発中にうまくいっていましたが、今朝は生産中にクラッシュしました。あなたの推薦を試してください。 –

+0

@desaiw:JFYI、この後に私たちの通知にもたらされたすべての破損は、サーバーのクラッシュ、サーバーのハングなどによって引き起こされましたが、未処理または未知のものはありません。 –

+0

あなたの投稿に続いて、私は同意すると言うことができます。私たちのデータベースは今や正常に動作しています。もう一度ありがとうございます。 –

5

SQL Server CE 4.0を使用している場合、データがディスクにフラッシュされないようにする既知の問題があります(AT ALL)。自分の言葉でhttps://support.microsoft.com/en-us/kb/2979868と修正プログラムhttps://support.microsoft.com/en-us/kb/2960153

がコミットされたトランザクションは、Microsoft SQL Server Compactの4.0でディスクにフラッシュされる前に、接続文字列内の最大秒数のフラッシュ間隔を指定していると仮定。このような状況では、コミットされたトランザクションは、ディスクにフラッシュされるフラッシュ間隔よりもはるかに時間がかかり、ディスクにフラッシュされないことさえあります。さらに、異常なプログラム終了が発生した場合にデータ損失が発生します。

この問題を解決する修正プログラムは、SQL Server Compactのためのオンデマンドの修正プログラムの更新プログラムパッケージで4.0のService Pack 1に含まれ

供給問題を回避するには、あなたが確認するブロックの周りに transaction.Commit(CommitMode.Immediate)を使用することです

+0

答えのリンクから解決策を説明してください。これはリンク腐敗に対する保険です。 –

+0

ありがとう@JamesJones Iveはそれを更新しました。 – hsorbo

関連する問題