65 個のモジュールを持つデスクトップ アプリがあり、その約半分が SQLite データベースから読み書きされます。データベースが SQliteDatabaseError をスローする方法は3 つあります。
- SQL 論理エラーまたはデータベースの欠落 (時々予期せず発生)
- データベースがロックされている (SQLite Database Browser などの別のプログラムによって編集されている場合)
- ディスク I/O エラー (予期せず発生することもあります)
これらのエラーは頻繁に発生するわけではありませんが、発生するとアプリケーションが完全にロックされるため、そのままにしておくことはできません。
そのため、データベースへのすべてのアクセスを、独自のモジュール内の共通の「データベースアクセス関数」へのポインターになるように書き直し始めました。その関数は、これら 3 つのエラーを例外としてキャッチできるため、クラッシュせず、それに応じてユーザーに警告することもできます。たとえば、「データベースがロックされているというエラー」の場合は、これを通知し、データベースを使用しているプログラムを閉じてから再試行するようにユーザーに求めます。(他のエラーの場合は、ユーザーに後で再試行するように指示する可能性があります...まだわかりません)。これを行うためにすべてのデータベース アクセスを更新することは、ほとんどの場合、共通の機能へのリダイレクトをコピーして貼り付けるだけです。簡単な作業です。
問題は、このデータベース アクセス機能とその通知を提供するだけでは十分ではないということです。これは、65 個のモジュールのデータベース アクセスのすべてのポイントで、データベースがデータを正常に返すか完了することを前提としたアクセスに続くコードがあるためです。書き込み--そうでない場合、そのコードにはそのための条件が必要です。ただし、これらの条件文を作成するには、各アクセス ポイントを注意深く調べて、最適な処理方法を検討する必要があります。この方法でパッチを適用する必要がある数百回のデータベース アクセスには、これは面倒で困難です。
私はそれを喜んで行いますが、より効率的で賢い方法、または少なくともこの修正を効率的かつ適切に完了するのに役立つヒューリスティックがあるかどうかを問い合わせると思いました。
(このアプリケーションには特定の「アーキテクチャ」はないと述べておく必要があります...ほとんどの場合、「ラビオリ コード」と呼ばれるものであり、GUI とデータベースの呼び出しとロジックがすべて「一緒に機能する」単位でまとめられています。現時点では、プロジェクト全体のアーキテクチャを MVC などで書き直すつもりはありませんが、将来のプロジェクトでは検討したいと思います。)