0

如果我static DB Connection将一个装箱C# Web service

这个连接实例是在所有网络服务上共享的吗?那么,这样我会有问题吗?

连接时不允许更改“ConnectionString”属性(状态=正在连接)

我以这种方式获取实例:

  public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
  {
   if (_dbConnection == null) 
   {
    _dbConnection = new OleDbConnection(aConnectionString);
    _dbConnection.Open();
   }
   else 
   {
    _dbConnection.Close();
    _dbConnection = new OleDbConnection(aConnectionString);
    _dbConnection.Open();
   }
   Log.Logger.log("Aperta connessione al DB");
   return _dbConnection;
  }
4

2 回答 2

4

保持全局连接实例始终是一种不好的做法。您应该遵循标准模式:create, open, use, close and destroy.
与此相反的工作迟早会导致问题。连接池机制就是为此而研究的
。 池将帮助您避免这种坏习惯,即让一个对象如此昂贵,例如数据库连接在不可预见的时间内打开

public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
{
    OleDbConnection odb = new OleDbConnection(aConnectionString);
    odb.Open();
    Log.Logger.log("Aperta connessione al DB");
    return odb;
}

然后您的客户端代码使用using 语句关闭和销毁连接

using(OleDbConnection cn = SqlClassHelper.GetDatabaseConnection(constring))
{

    // define here your OleDbCommand, OleDbDataReader etc...
    // use the objects

} // <- here the closing brace close and destroy the connection
于 2013-05-27T13:38:46.503 回答
1

是的,您的代码在多线程 Web 服务中会出现问题。

你的函数GetDatabaseConnection就像一个工厂,每个调用它的人都会得到一个新的连接实例。您不需要静态_dbConnection类成员,只需将其设为局部变量即可:

  public static OleDbConnection GetDatabaseConnection(string aConnectionString) 
  {
    OleDbConnection _dbConnection  = new OleDbConnection(aConnectionString);
    _dbConnection.Open();
    Log.Logger.log("Aperta connessione al DB");
    return _dbConnection;
  }
于 2013-05-27T13:38:07.663 回答