0

私は以下のコードを使用しています。私がしたいのは、ユーザーがログインしている間ずっと同じ接続を使用することです。使用についての私の理解は、接続を破棄することですが、私が本当にやりたいことはユーザーがログインすると、接続が作成され、その特定の接続が使用されます。

以下は、C# で接続を設定するために機能することがわかっているコードです。[ThreadStatic] 属性を に適用public static MySqlConnection ATCrawlerConnectionしますが、基本的にユーザーごとに接続を作成し、その接続にアクセスして制限することで、aspx で同様の機能を実現するにはどうすればよいですか?ユーザー?

C# では、これを使用します。

MySQLProcessing.MySQLStatic.ATCrawlerConnection MySQLProcessing.MySQLStatic.OpenCon("10.2", 3306, "user", "pw");

public static MySqlConnection ATCrawlerConnection { get; 設定; }

public static MySqlConnection OpenCon (文字列 ServerAddress、int PortAddress、文字列 UserID、文字列 Password) { MySqlConnection masterOpenCON = new MySqlConnection("server=" + ServerAddress + ";Port=" + PortAddress + ";UID=" + UserID + ";PASSWORD=" + Password);// + ";connectiontimeout=" + ConnectionTimeOut + " ;"); masterOpenCON.Open(); masterOpenCON を返します。 }

public static DataTable StoreProcedureDTTable(string mysqlQuery, string[] CommandArgs, string queryName) { lock (_object) { using (MySqlConnection cn = new MySqlConnection(applicationStringClass.AuthMySQLConnector)) { DataTable DTTableTable = new DataTable(); try { MySqlCommand MySQLCommandFunc = new MySqlCommand(mysqlQuery); MySQLCommandFunc.Connection = cn; MySQLCommandFunc.CommandType = CommandType.StoredProcedure; foreach (string args in CommandArgs) { string[] splitArgs = args.Split('|'); MySQLCommandFunc.Parameters.AddWithValue(splitArgs[0], splitArgs[1]); } MySqlDataAdapter DataDTTables = new MySqlDataAdapter(MySQLCommandFunc); DataTable DataDTTablesDT = new DataTable(); DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; } catch (Exception ex) { } return DTTableTable; } } }
4

3 に答える 3

0

あなたがすべき

  • 必要なときに接続を作成し、使用しなくなったらすぐに破棄します
  • すべての接続で同じ接続文字列を保持する
  • 異なるスレッドで接続を共有しないでください。そうしないと、2 つのスレッドが同時に接続を使用するとエラーが発生します。ロックを設定するため、静的メソッドではこの問題は発生しませんが、サーバーの負荷が重すぎると、ロックの取得を待機することで多くの時間が失われます。

.NET は、新しい接続を作成するたびに接続を開かないように既に最適化されています。これは「接続プーリング」と呼ばれます。同じ接続文字列を保持する必要があるのは、接続プールがこれを使用して接続を「キャッシュ」するためです。したがって、接続文字列 (アプリケーション名など) を変更すると、新しい接続が作成されます。

したがって、既に行われていることを実行しようとしないでください。クエリのバッチが完了したら、新しい接続を作成してできるだけ早く破棄してください。

于 2012-05-19T18:49:26.740 に答える
0

最初に、警告: あなたが求めていることを絶対にやるべきではありません。特に Web サイトに適用する場合は、非常に悪い考えです。ほとんどのデータベース ライブラリは、接続プール戦略を使用してリソースの使用量を削減し、接続を必要以上に長く開いたままにしておくと、それが台無しになります。また、接続がいつ終了したかを知る明確な方法がない場合、リソースがリークする可能性があります。

と言い張るのですが…。

ASP.NET で「特定のユーザーのために」何かをしたいときはいつでも、通常、セッション状態の追跡を探しています。Session オブジェクトを使用して、ASP.NET がユーザーごとに追跡する任意の情報を格納できます。(ここでの「ユーザー」とは、サイトにアクセスする特定の Cookie を持つブラウザーを意味します。)

Microsoft のセッション状態の概要ページで説明されているように、Session オブジェクトを介したユーザーごとの接続の設定と保​​存は非常に簡単です。

トリッキーな部分は、いつ閉じるかを知ることです。サイトに明確に定義されたログインおよびログアウト戦略がある場合、それは良い可能性です。ただし、ユーザーが常にそのログアウト ページにアクセスするとは限りません。セッション状態はワーカー プロセスのメモリに保存され、IIS はこれをリサイクルします (主にこの正確な問題を軽減するため) が、これは決定論的ではありません。これが、開いているリソースをセッション状態に保存することが推奨されない主な理由の 1 つです。

于 2012-05-19T18:51:36.993 に答える
0

それを構築した人々の定義によって、ASP.NET (またはその問題に関するその他のテクノロジ) が使用されるはずの方法を壊しても、問題を解決することはできません。ユーザーの一時データを保存したい場合 (元の投稿では言及していません)、DB の物理テーブルを使用したり、ASP.NET の On_SessionEnd イベントを使用してすべてのユーザーを削除したりするなど、他の戦略を使用できます。に関連するデータ、または一時データを proc メモリに保存します。
あなたは実際にセッションデータを db 内に保存することができ、mysqlもsqlサーバーも一時テーブルを使用していないことを確信していますが、提案した手法に似たものを適用します

于 2012-05-19T19:35:06.853 に答える