本文主要是介绍底层原理,单纯的使用可以不看这文章,毕竟ORM也是用的底层的ADO,知道些原理心理更加安心一些
启用连接池
连接字符串中将连接池值 Pooling 设置为 true 或 yes,则会启用连接池(默认启用)。
连接池就是有一些与数据库的连接放在里面,建立新的连接时系统会先看里面有没有一样的连接,有就不用新建了
Open() 连接数据库连接池
Close ()方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接,应用程序可以多次调用 Close。不会生成任何异常。
dispose()方法实际是和close()做的同一件事
SqlSugar.dispose() 和ADO有点区别 1、执行ADO的.Dispose 2、下次用在new connection,不会报错
唯一的区别是Dispose方法清空了connectionString,即设置为了null.
上面2者唯一区别就是 dispose 之后就不能在用了(没有连接字符串),Close 可以
//1.Close SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg"); con.Open(); con.Close(); //2.dispose SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg"); con.Open(); con.Dispose()//con 不能用了 //3.using using(SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg")) { con.Open(); }//using完自动调用dispose //上面3种用法都是OK的 ,1和2最好加上异常处理
那么我们正常使用也就是open close或者using
SqlConnection非线程安全对象,不同上下文要new不同对象
con.Open(); //请求数据库连接池 查找有没有 sleep 状态的,没有创建连接池 con.Close();//将当前连接池状态改为sleep , 如果长时间不用会销毁
上面的原理可以看出
1. 同一个对象多次open 和 close 都是在现有的连接池里面去操作
2. 就算是多个SqlConnection不在同时间请求,也可能会用同一个连接池
3.多个SqlConnection并发操作会找有没有空闲的连接池,没有在创建
所以连接池在.NET中 微软封装的很好,很成熟 多数.NET用户都不知道是什么玩意儿
在连接池符串加上 Connection Timeout=10 ,默认是30秒,单位秒
答:什么都不用配置只要学会 open和close就行了
1.手动释放模式和SqlConnection原理一模一样,底层就是用的SqlConnection并且需要注意线程安全
//创建数据库对象 SqlSugarClient SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer, IsAutoCloseConnection = false//手动释放 是长连接 }); //需要手动using //或者 //db.Open(); //db.Close();
2.自动释放(推荐),说白了不需要你去写using或者 close和open
//创建数据库对象 SqlSugarClient SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer, IsAutoCloseConnection = true//自动释放 }); //写代码就不需要考虑 open close 直接用就行了
情况1:没有事务的情况 ,每次操作自动调用 open和close
情况2: 有事务的情况下 ,开启事务调用 open 提交或者回滚事务调用 close
它是对SqlSugarClient的封装让他支持线程安全,并且在不同上下文自动new 出 SqlSugarClient,在编写代码的时候不需要考虑他线程是否安全
异步情况: 在同一串await 中是一个上下文
同步情况: 在同一个线程是同一个上下文
同一个SqlSugarScope做到了在同一个上下文共享一个对象,不同上下文自动去NEW
默认情况下只要超过100个请求没关闭就会报错,不同库可能有差异
for (int i = 0; i < 501; i++) { SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.Oracle, ConnectionString = Config.ConnectionString, IsAutoCloseConnection = false//设成关闭这个代码会直接报错 }); db.Ado.GetInt("SELECT 1 from dual"); } //IsAutoCloseConnection=true 执行成功 //IsAutoCloseConnection=false 会提交连接池超时或者超过上限等错误
他们3者的关系应该是这样的:
SqlSugarScope 底层+自动释放+上下文安全
SqlSugarClient 底层+自动释放控制
SqlConnection 底层
2016 © donet5.comApache Licence 2.0