数据库连接池提高系统运行效率
最近在做一个BS的系统,个人负责数据库,后台,做了才发现数据库也这般不简单,特别还是空间数据库,有的数据经常要重复读取,在怎样保持数据库SqlConnection一直常开的问题中,看到了这篇文章,觉得还好,分享下!
摘自《Asp.net 2.0揭秘 卷1》
数据库连接是非常昂贵的资源,如果希望Asp.net应用程序具有处理大量用户请求的能力,那么任何时候都不要浪费数据库连接。
建立并打开一个数据连接是一个很耗时的操作,每次需要使用数据库时才去建立数据库接的效率非常低,而更好的方法是创建一个缓存池存放在多次数据库查询中可能被重复使用的数据库连接。
当连接池功能开启后,执行关闭连接的操作并不会真正地关闭数据库服务器端的连接,而是通过这个关闭操作将连接放回到连接池中,这样,当需要再次执行数据库查询时,就不用再重新开启全新的数据库连接了。
当使用SqlConnection 对象时,连接池是默认开启的,在默认情况下,Ado.net Framework最多在连接池中保持100个打开的连的接。
关于连接池功能必须注意两件事情:
第一:在利用连接池功能时,调用SqlConnection.close()方法关闭连接。如果不显式地关闭连接,当前正使用的连接就不会被放入到连接池中,虽然最终Ado.net会回收这些未关闭的连接,不过那可能需要很长的时间,并且无法确定连接到底会在什么时候回收。
第二:系统根据连接字符串的不同,分别为其创建不同的连接池,更严格的来说,系统会分别为每个唯一的连接字符串,过程,应用程序域和Window标识创建连接池。系统将使用逐字比较的方法翻覆地比较连接字符串。因此,应该将系统所用的连接字符串存放在站点Web.config中。尽量不要在组件代码中硬编码连字符串。一旦两字连接字符串之间出现任何细微的差别,系统就会创建一个新的连接池。
SqlConnection对应在编辑上提供了两个清空连接池的方法:
1、 ClearAllPools-用于清空系统中所有的连接池里的数据库连接;
2、 ClearPool-用于清空系统中指定连接池里的数据库连接。
可以使用以下连接字符串中的属性来控制连接的池化效果:
1、 Connection Timeout-用于指定以秒为单位的连接生存期最大值(默认值是0,表示连接永不失效) ;
2、 Connection Reset-用于指示是否自支重置来自连接池中的连接(默认值是True);
3、 Enlist-用于指示是否将连接置入当前事务的上下文中(默认是True);
4、 Load Balance Timeout-同Connection Timeout属性;
5、 Max Pool Size-用于指定保存在连接池中的最大连接数(默认值是100);
6、 Min Pool Size-用于指定保存在连接池中最小的连接数(默认值是0);
7、 Pooling -用于指定是否启用连池功能(默认为True)。
例:web.config中
- <connectionStrings>
- <add name="MYDBConnection"
- connectionString="Min Pool Size=10;
- Max Pool Size=100;
- Connection Timeout=10;
- Data Source=www;
- Initial Catalog=SuperMapData;
- Integrated Security=True"
- providerName="System.Data.SqlClient"/>
- </connectionStrings>
复制代码