私は書き直している古いC#アプリケーションでMySQL .Netライブラリを使用しています。データアクセスレイヤーはむしろ時代遅れですが、私はそれを最大限に活用しようとしています。しかし、今は本当に面倒なスレッド問題に遭遇しました。私のスタティックDALのMySQLスレッディング問題
レポートを処理するために使用される一連の約20のSelect文があります。完了までに約5秒かかりますし、Select文が実行されている間にプログレスバーを表示しています。私は、単純なThreadPoolの呼び出しを経由して操作を開始しています:
[LATER EDIT:何が起こることは私が原因私のUIのバグに二回以下のメソッドを呼び出したということである - これは質問を切り下げるませんが、単に私のスレッドが互いに競争した理由を説明する。]
ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateChart));
- 時にはそれが動作します。
- 「可能なIOストリーム競合状態」でクラッシュすることがあります。
- 「接続が有効かつ有効である」とクラッシュすることがあります。
- "オブジェクト参照が設定されていません..."とクラッシュすることがあります。
私のDALのすべてのクラスは、これがパフォーマンスを向上させる良い方法だと思っていたので静的です(小さな操作ごとに新しいクラスインスタンスを作成する必要はありません)。
そして、すべての私のDALクラスは、接続を構築し、同じ「ルート」DALクラスを使用します。
public static class MySQLConnectionBuilder
{
private static MySqlConnectionStringBuilder ConnectionStringBuilder = new MySqlConnectionStringBuilder();
//I'm initializing the ConnectionStringBuilder with my server password & address.
public static MySqlConnection GetConnection()
{
return new MySqlConnection(ConnectionStringBuilder.ConnectionString);
}
}
すべての私のDALのクラスは、クラッシュの機能と同様な機能を持っています。クラッシュ関数は次のようになります。
public static STDS.UserPresence.user_presenceDataTable GetPresence (int aUserID, DateTime aStart, DateTime aEnd)
{
ta.Connection = MySQLConnectionBuilder.GetConnection();
ds = ta.GetPresenceForUserBetweenDates(aUserID, aStart, aEnd);
ta.Connection.Close();
return ds;
}
アイデア?改善のヒント?よりオブジェクト指向の(インスタンス駆動型)DALに切り替えると、スレッドの問題はなくなりますか?必ずしも同じスレッドで作成した接続 -
5秒遅れで間違っているか、それともSQLコールごとに5秒かかるのですか?20 x 5?投稿されたものから、私はあなたのDb接続と呼び出しをどのようにしてConnectionPoolingとパフォーマンスに関するいくつかの調査をしています。 – Lloyd
MySQLライブラリはConnectionPoolingを使用していますが、私のマルチスレッドの状況では正しく動作しません。だからこそ私はここに投稿しました。なぜなら、私は可能な解決策が不思議だからです。 5秒間:超高速でなければならないデスクトップアプリケーションのボタンをクリックすると、長い時間がかかります。それだけでなく、今後数か月のうちにこの期間が20秒になると予想しています。 – Axonn
Using(MySqlConnection conn = new MySqlConnection(connectionString)){{}}を使用し、フレームワークが設計どおりにプールを管理できるように、それぞれの静的メソッドで新しいMySqlConnectionを定義、初期化、あなたがしていることは、単に自分の混乱を作り出します。現在のメソッドで例外がスローされた場合、接続はどのように閉じられていますか? – Lloyd