2017-10-30 7 views
0

ストア手順の中で、結果を保存するための一時テーブルを作成します。これは、が1つ以上ある場合に競合しますこのストア手順1接続 name =>どのリクエストにどのリクエストが属しているかを区別する必要はありません)。どのようにC#のMySQLに完全に新しいconnetionを作成するには?

BEGIN 
    CREATE TEMPORARY TABLE IF NOT EXISTS TempTable (RowOrdinal INT DEFAULT 0); 
    INSERT INTO TempTable(RowOrdinal) VALUES (1); 
    SELECT COUNT(*) FROM TempTable; 
END $$ 

あなたが見ることができるように、同じ接続では、あなたがこの店を呼び出すたびに、TempTableのは1つのより多くの行が追加されます。

私のC#プロジェクトでは、ストアプロシージャを呼び出すための新しいMySQL接続を作成するいくつかの方法をテストします。私は呼んで、それぞれの方法で

public int CallStoreFunction() 
{ 
    var result = 0; 
    using(var connection = new MySqlConnection(connectionString)) 
    { 
    connection.Open(); 
    var command = new MySqlCommand("CALL store_proc()", connection) 
    result = int.Parse(command.ExecuteScalar().ToString()); 
    connection.Close(); 
    } 
    return result; 
} 

  1. 、新しいインスタンスを作成して接続を作成します

    public int CallStoreFunction() 
    { 
        return result = dbcontext.Database.SqlQuery<int>("CALL store_proc()"); 
    } 
    
  2. を使用して、(エンティティフレームワークでの)新しいdbcontextを作成します。この関数は4回実行され、結局のところ結果は4です(これは、ストアへの各呼び出しが同じ接続内にあることを意味します)

    C#のように見えるのは、新しい接続ではなく新しいセッション/トランザクションを作成するだけで、どのアプローチを使用しても問題ありません。私は、このストアにリクエストするたびにDBとの接続を完全に作成する方法ですか? ありがとうございます!

+0

一時テーブルを作成するときは、[CREATE TEMPORARY TABLE '](https://dev.mysql.com/doc/refman/5.7/en/create-temporary-table.html)の構文ですか? EFとADOの両方で接続プーリングが使用されるため、接続が解放された場合(クローズ+ディスポーザルを使用している場合)、同じ接続がプールから返されることがよくあります。 'TEMPORARY'表はセッションごとにする必要があります。したがって、接続プーリングを使用しても一意でなければなりません。 – StuartLC

答えて

2

ADO.NETは接続プール内の接続を管理します。 に接続すると、プール内で使用可能な接続が検索されます。使用可能な場合は返されます(新しい接続を作成しないでください)。 と呼ぶと、アクティブ状態のプールに戻ります(再利用の準備ができています)。

したがって、コードでは同じ接続と同じ一時テーブルが使用されています。完全接続を作成する場合は、プールを最初にクリアするを先に実行する必要があります。 ADO.NETはClearAllPoolsをサポートし、ClearPoolは、MySQLのためには、次のようになります。

 var result = 0; 

     var connectionString = ConfigurationManager.ConnectionStrings["your_connection"].ConnectionString; 
     using (var connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      var command = new MySqlCommand("CALL new_procedure()", connection); 
      result = int.Parse(command.ExecuteScalar().ToString()); 
      MySql.Data.MySqlClient.MySqlConnection.ClearPool(connection); 
      connection.Close();     
     } 

     using (var connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      var command = new MySqlCommand("CALL new_procedure()", connection); 
      result = int.Parse(command.ExecuteScalar().ToString()); 
      connection.Close();     
     } 
     using (var connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      var command = new MySqlCommand("CALL new_procedure()", connection); 
      result = int.Parse(command.ExecuteScalar().ToString()); 
      connection.Close();     
     }  

結果= 1、および結果= 2

参考:たとえば

MySql.Data.MySqlClient.MySqlConnection.ClearPool(connection); 

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

関連する問題