public class DatabaseConnectionWrapper : IDisposable
{
// Fields
private DbConnection Connection;
private int refCount; // Methods
public DatabaseConnectionWrapper(DbConnection connection)
{
this.Connection = connection;
this.refCount = 1;
} public DatabaseConnectionWrapper AddRef()
{
Interlocked.Increment(ref this.refCount);
return this;
}
}上面是微软企业库里一个数据库连接的帮助类,在第一次创建一个数据库连接的时候,都会实例化该类,并传入DbConnection,且计数refCount变量;同时还有一个对于进行事务时候使用的类public static class TransactionScopeConnections
{
// Fields
private static readonly Dictionary<Transaction, Dictionary<string, DatabaseConnectionWrapper>> transactionConnections = new Dictionary<Transaction, Dictionary<string, DatabaseConnectionWrapper>>(); // Methods
public static DatabaseConnectionWrapper GetConnection(Database db)
{
Dictionary<string, DatabaseConnectionWrapper> connectionList;
DatabaseConnectionWrapper connection;
Transaction currentTransaction = Transaction.Current;
if (currentTransaction == null)
{
return null;
}
lock (transactionConnections)
{
if (!transactionConnections.TryGetValue(currentTransaction, out connectionList))
{
connectionList = new Dictionary<string, DatabaseConnectionWrapper>();
transactionConnections.Add(currentTransaction, connectionList);
currentTransaction.TransactionCompleted += new TransactionCompletedEventHandler(TransactionScopeConnections.OnTransactionCompleted);
}
}
lock (connectionList)
{
if (!connectionList.TryGetValue(db.ConnectionString, out connection))
{
connection = new DatabaseConnectionWrapper(db.GetNewOpenConnection());
connectionList.Add(db.ConnectionString, connection);
}
connection.AddRef();
}
return connection;
}
}事实上,在执行数据库操作的时候,在要进行数据库连接的时候,都会先使用TransactionScopeConnections类,调用GetConnection方法,判断在当前事务字典中的数据库连接字典中是否存在指定连接对象,如果存在就使用那个对象,并且计数递增,否则就直接实例化DatabaseConnectionWrapper,那么计数就从1开始我不理解的是这里对数据库连接进行计数的作用是为了做什么
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货