2017-10-30 21 views
0

저장 프로 시저 내에서 결과를 저장할 임시 테이블을 만듭니다. 알아두면 이있는 경우 충돌이 발생합니다이이 저장 프로 시저에 의 연결 (단지 임시 테이블 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입니다 (상점에 대한 각 호출이 여전히 동일한 연결에 있음을 의미 함)

    C#처럼 보이는 것은 새로운 연결이 아니라 새로운 세션/트랜잭션을 만듭니다. 어떤 접근 방식을 사용 하던지 상관 없습니다. 내가이 상점에 요청할 때마다 DB에 대한 총 다른 연결을 만드는 방법이 궁금합니다. 미리 감사드립니다.

+0

임시 테이블을 만들 때 [임시 테이블 만들기]를 사용하고 있습니다. '] (https://dev.mysql.com/doc/refman/5.7/en/create-temporary-table.html) 구문, 맞습니까? EF와 ADO는 모두 연결 풀링을 사용하므로 연결이 해제 된 경우 (Close + Dispose로 수행하는 경우) 풀에서 동일한 연결을 반환하는 경우가 많습니다. '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