「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;
}