如果我将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;
}
答案 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;
}