1

「ExecuteNoQuery」(dbCommand.ExecuteNonQuery() を実行) と「Query」(dbCommand.ExecuteReader()) の 2 つのメソッドがあります。どちらの方法も同じ接続オブジェクトを使用しています。ExecuteNoQuery メソッドではロックが実装され (接続オブジェクトを使用)、Query メソッドはロックなしで実装されます。複数のスレッドの場合、異なるスレッドが両方のメソッドに同時にアクセスするとどうなりますか?

注: Query メソッドでは、カスタム接続プールが同じオブジェクトで実装されます。

public int ExecuteNoQuery(string sqlquery, Hashtable htData) {
try {
 lock(Myservice.dbcon)  
  {
    using (OracleCommand dbCommand = new OracleCommand(sqlquery, Myservice.dbcon)) 
        {

              int rowCount = dbCommand.ExecuteNonQuery();
              return 1;
        }
  }
}


public OracleDataReader Query(string sqlquery, Hashtable htData)
    {
        try
        {
            OracleDataReader dbReader = null;
            Random ran = new Random();
            int randomnumber = ran.Next(1,5);

           Myservice.dbcon = (OracleConnection) Myservice.htdbcon
           ["Connection_" +randomnumber];

            if (Myservice.dbcon.State != System.Data.ConnectionState.Executing 
              || Myservice.dbcon !=  System.Data.ConnectionState.Fetching)
                {
                    using (OracleCommand dbCommand = new OracleCommand(sqlquery,
                     Myservice.dbcon))
                    { 

                        dbReader = dbCommand.ExecuteReader();
                    }
                }
                return dbReader;

        }
4

1 に答える 1

1

どちらの方法も同じ接続オブジェクトを使用しています。

一方の方法ではロックを使用し、もう一方の方法では使用しないため、悪いことです。このシナリオでは、オブジェクトによって保証されないため、興味深い方法で失敗することを期待する必要があります。両方の場所から同じロック オブジェクトを使用するか、より良い方法として、共有接続ではなく、分離されたコードでのみ接続を使用する必要があります。接続プーリングでは、共有接続オブジェクトをどこかに持つことはほとんど役に立ちません。はるかに適切なパターンは、通常、必要なときに接続を取得してから破棄することです。基になるプロバイダーがプーリングをサポートしている場合、これは同期の問題なく理想的に実行され、並列クエリなどが可能になります。たとえば、次のようになります。

using (var conn = SomeUtilityClass.GetOpenConnection())
using (var cmd = conn.CreateCommand()) 
{
    cmd.CommandText = sqlquery;
    int rowCount = dbCommand.ExecuteNonQuery();
    return 1;
}

そして、重要なことに、メソッドから同じことを行います。Queryロックもグローバル共有接続もありません。

また、パラメーターの不足も懸念されます。これは、SQL インジェクション エラーにさらされていることを示唆しています。

于 2013-02-15T11:31:39.330 に答える