2012-03-22 2 views
1

누구든지이 코드가 동시성을 유발할 수 있는지 여부를 알려주십시오.Concurrecy In Static Classes

이것은 양식에서 사용되며 일부 데이터베이스 트랜잭션에 사용되는 정적 클래스입니다.

이것은 asp.net 페이지에서 정적 함수를 호출하고 매개 변수를 ref 유형으로 전달하는 것과 관련됩니다.

참조 유형을 사용하고 있습니다.

웹 기반이므로 일부 동시성을 만듭니다. 여기 ///

내 샘플 클래스에서 코드입니다.

public static class DataClass 
{ 

    static SqlConnection con = new SqlConnection(
     ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"] 
               .ConnectionString); 

    public static string GetCon() 

    { 

    return ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString; 

    } 
    public static void Conn(ref SqlConnection con) 
    { 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
     } 
    } 
    public static DataSet GetDataSet(string qry) 
    { 
     SqlDataAdapter adp = new SqlDataAdapter(qry, con); 
     DataSet ds = new DataSet(); 
     adp.Fill(ds); 
     return ds; 
    } 
    public static bool ExecuteCommand(ref SqlCommand cmd) 
    { 
     bool i =true; 
     cmd.Connection = con; 
     Conn(ref con); 
     SqlTransaction trans =con.BeginTransaction(); 
     cmd.Transaction = trans; 
     try 
     { 
      cmd.ExecuteNonQuery(); 
      trans.Commit(); 
     } 
     catch 
     { 
      trans.Rollback(); 
      i = false; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      con.Close(); 
     } 
     return i; 
    } 
} 
+0

동시성이 올바른 단어가 아닌 것 같습니다. 당신이 묻고있는 것을 다시 말해 줄 수 있습니까? –

+0

함수 호출에 전달 된 값이 동시 호출에서 겹칠 수있는 경우 두려워하더라도 동시 스레드에서 생각합니다. – Rohit

답변

1

정적 SQLConnection을 정의 했으므로 동시성 문제가 발생할 수 있습니다.

static SqlConnection con = new SqlConnection (ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString); 

두 개의 서로 다른 개체가 쿼리를 실행하려고하면 SQL 연결 개체의 동일한 인스턴스에서 실행됩니다.

using(var conn = OpenConnection()) { 
    ...//code 
} 

OpenConnection :

1

네, 스레드로부터 안전하지 않습니다/그러나,하는 SqlClient 기본적으로 연결 풀링을 사용하기 때문에, 당신은 뭔가를 할 정적 연결을 삭제하고, 각 사용을 할 수 있습니다 매번 SqlConnection을 반환합니다. 이것은 매번 다른 기본이 아닌 연결이며, 일반적으로 (winform에서) 사용되는 연결 수가 매우 적습니다 (실제로 운이 좋은 경우 1 개).

+0

thanx @MarcGravell 또한 ExeuteCommand()에 문제가있는 경우 ref 형식의 매개 변수를 사용합니다. – Rohit

+0

@RohitKumar 그 'ref'에 대한 이유는 전혀 없습니다. 거기에는 아무런 도움이되지 않습니다. 마찬가지로'ExecuteCommand'에도 있습니다. 가혹한 것처럼 들린다면 (내 의도는 아니지만) 사과해야하지만, 그 코드에서 필자는 저자가'ref'가하는 것을 완전히 이해하지 못한다고 결론을 내린다. –

+0

고맙습니다 forx 정직한 의견 ......... 나는 그것을 좋아하지 않아. – Rohit