CSLA中实现了嵌套数据库连接时,使用一个数据库连接,看实例:
代码
1 private string _conn = "连接字符串";
2 private void InsertA()
3 {
4 using (var ctx = ConnectionManager<SqlConnection>.GetManager(_conn, false))
5 {
6 using (var cm = ctx.Connection.CreateCommand())
7 {
8 cm.CommandType = CommandType.Text;
9 cm.CommandText = "insert into a values('01')";
10 cm.ExecuteNonQuery();
11 }
12 InsertB();
13 }
14 }
15
16 private void InsertB()
17 {
18 using (var ctx = ConnectionManager<SqlConnection>.GetManager(_conn, false))
19 {
20 using (var cm = ctx.Connection.CreateCommand())
21 {
22 cm.CommandType = CommandType.Text;
23 cm.CommandText = "insert into b values('02')";
24 cm.ExecuteNonQuery();
25 }
26 }
27 }
2 private void InsertA()
3 {
4 using (var ctx = ConnectionManager<SqlConnection>.GetManager(_conn, false))
5 {
6 using (var cm = ctx.Connection.CreateCommand())
7 {
8 cm.CommandType = CommandType.Text;
9 cm.CommandText = "insert into a values('01')";
10 cm.ExecuteNonQuery();
11 }
12 InsertB();
13 }
14 }
15
16 private void InsertB()
17 {
18 using (var ctx = ConnectionManager<SqlConnection>.GetManager(_conn, false))
19 {
20 using (var cm = ctx.Connection.CreateCommand())
21 {
22 cm.CommandType = CommandType.Text;
23 cm.CommandText = "insert into b values('02')";
24 cm.ExecuteNonQuery();
25 }
26 }
27 }
其中InsertB方法中创建连接时,会使用InsertA中创建的连接。
实现原理:
1、在InsertA中创建连接mgr(连接变量名),在本地上下文LocalContext中保存此连接字符串,并且有个计数器mRefCount++为1,
2、在InsertB中创建连接时,在LocalContext中发现有此连接字符串,则使用忆存在的连接mgr,计数器mRefCount++为2。
3、在InsertB中Using块结束时,计数器mRefCount--为1
4、在InsertA中Using块结束时,计数器mRefCount--为0,销毁数据库连接,LocalContext中移除连接字符串。