解析为何要关闭数据库连接,可不可以不关闭的问题详解
首先要说明的是连接数是有限制的:
代码如下:
for (int i = 0; i < 10000; i++)
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDbFilename=""E:\DB\NORTHWND.mdf"";
Integrated Security=True;Connect Timeout=30;User Instance=True");
conn.Open();
Console.WriteLine("打开了{0}个连接", i);
}
运行结果如下:
过一会就会提示打开连接超时了:
可以看到数据库连接时有限制的,如果连接不关闭,而且使用的人比较多,那么系统很快就down掉了。
但是有时候由于某些原因应用程序可能只是几个人使用,所以就有人设计了:
在应用程序启动的时候打开数据库连接,在应用程序关闭的时候关闭数据库连接
那么使用这种方式有什么问题呢?
首先假设有一张表Nums,表定义如下:
Main代码如下:
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDbFilename=""E:\DB\NORTHWND.mdf"";
Integrated Security=True;Connect Timeout=30;User Instance=True");
conn.Open();
Parallel.For(1, 9999, (id) =>
{
ExecuteCommand(conn, id);
});
就是从1到9999开始执行ExecuteCommand
ExecuteCommand代码如下:
private static void ExecuteCommand(SqlConnection conn, int id)
{
Console.WriteLine("正在执行." + id);
Thread.Sleep(100);
SqlCommand cmd = new SqlCommand(
string.Format("Insert into Nums values('{0}') ", id), conn);
cmd.ExecuteNonQuery();
}
运行:
可以看到ExecuteNonQuery方法抛出了异常,原因是连接处于关闭状态。
可是我们的连接一直都是open着的啊,并没有调用close,dispose之类的方法啊。
于是在ExecuteCommand前面增加判断条件:
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();再次运行:
可以看到还是会出现连接已关闭的问题。你知道什么原因吗?
这里是由于多线程环境引起的。所以需要加锁。
private static object syncObj = new object();
private static void ExecuteCommand(SqlConnection conn, int id)
{
lock (syncObj)
{
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();
Console.WriteLine("正在执行.." + id);
Thread.Sleep(100);
SqlCommand cmd = new SqlCommand(
string.Format("Insert into Nums values('{0}') ", id), conn);
cmd.ExecuteNonQuery();
}
}
再次运行:可以发现基本没问题了.
修改Parallel.For的最大值上限,要测试下是否可以长期执行了。
Parallel.For(1, Int32.MaxValue, (id) =>
{
ExecuteCommand(conn, id);
});
一天测试下来,没出现任何问题。
结论:对于某些只有几个人使用的应用程序,可以不关闭数据库连接,但是在写代码的时候最好要加上连接是否打开的判断。
- 遇到的问题--------C#连接数据库的语句带特殊字符时无法解析
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- 项目数据库连接关闭问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- VS下QT插件 连接数据库出现error LNK2019: 无法解析的外部符号QSqlDatabase问题解决
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- mysql反向解析导致连接数据库过慢的问题
- plSQL技巧:“tns:无法解析指定的连接标识符”问题详解
- 详解多线程Django程序耗尽数据库连接的问题
- “sqlExeption:数据库连接已关闭”问题
- 数据库——“该连接已关闭”问题解决方案
- ORA-12537:TNS:连接关闭 -------数据库最大连接数问题
- Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
- 数据库连接监控组件,避免日常开发中因为数据库连接长时间占用或业务完成后忘记关闭连接所带来的数据库问题
- .Net数据库访问问题:已有打开的与此连接相关联的 DataReader,必须首先将它关闭。
- plSQL技巧:“tns:无法解析指定的连接标识符”问题详解
- 关于数据库连接数问题(为什么要关闭数据库连接,可以不关闭吗?)
- weblogic数据库连接自动关闭问题