C#Web服务和静态数据库连接

时间:2013-05-27 13:30:18

标签: c# web-services oracle oledbconnection

如果我将static DB Connection打包成C# Web service

这个连接实例是在所有Web服务上共享的?那么,这样我可以解决这个问题吗?

  

不允许更改'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;
  }

2 个答案:

答案 0 :(得分:4)

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

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

然后您的客户端代码使用using statement来关闭并销毁连接

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

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

} // <- here the closing brace close and destroy the connection

答案 1 :(得分: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;
  }