为什么要关闭数据库连接,可以不关闭吗?
首先要说明的是连接数是有限制的:
代码如下:
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);
});
一天测试下来,没出现任何问题。
结论:对于某些只有几个人使用的应用程序,可以不关闭数据库连接,但是在写代码的时候最好要加上连接是否打开的判断。
from:http://www.cnblogs.com/LoveJenny/archive/2011/08/09/2131664.html
转载于:https://www.cnblogs.com/flysnow-z/archive/2011/08/12/2136038.html
为什么要关闭数据库连接,可以不关闭吗?相关推荐
- Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索
Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...
- EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响...
数据库 我们先在SQL Server数据库中建立一个Book表: CREATE TABLE [dbo].[Book]([ID] [int] IDENTITY(1,1) NOT NULL,[BookNa ...
- JDBC 关闭数据库连接与自动提交
// Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...
- 正确及时关闭数据库连接
1.1 概述 在JAVAEE后台编码时,时常出现没有正确及时关闭数据库连接资源(Connection,Statement, ResultSet)现象,导致程序运行过程中出现意想不到的错误. 本文档首 ...
- Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...
本文将带你了解Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit,希望本文对大家学Android有所帮助. 系统Api :打开新的 ...
- 热启动必须联网吗_供暖结束,地暖是关闭供水阀门还是关闭回水阀门?你做对了吗?...
天气渐渐暖和起来 很多城市都停止供暖了 一些家庭也停止使用地暖 那么今天就来聊一聊,停止供暖后 地暖系统应该怎么保养 地暖不用时候是关闭供水阀门还是关闭回水阀门? 供暖结束 暖气阀门到底要不要关 一般 ...
- java 关闭时_java – 活动关闭时服务停止
我已经阅读了一些与这个问题相关的答案,它们似乎都是一样的: "使用START_STICKY运行您的服务" "在前台运行您的服务" "使用startSe ...
- linux 关闭自动升级,开启关闭Centos的自动更新(转)
开启关闭Centos的自动更新 关闭Centos的自动更新,操作记录如下: [[email protected] alpha]# chkconfig –list yum-updatesd yum-up ...
- WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
原文:WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭 在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而 ...
- java io流不关闭_Java IO流关闭问题的深入研究
前几天看了一篇文章(见参考文章),自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题: 包装流的close方法是否会自动关闭被包装的流? 关闭流方法是否有顺序? 包装流的close ...
最新文章
- 华为harmonyos和ios,华为EMUI正式更名为HarmonyOS,看来华为真的是孤注一掷了
- 推荐8个私藏已久的实用网站,每一款都能带来惊喜!
- ant 编译java 项目_使用ant编译打包、部署简单的javaweb项目 --01
- 鸟哥的linux私房菜有乌班图,折腾Ubuntu的一些summary--初装Ubuntu18和重装Ubuntu18
- 「Luogu」[JSOI2007]字符加密 解题报告
- 【转】unity开发android游戏(一)搭建Unity安卓开发环境
- 解决mysql“Access denied for user 'root'@'localhost'”
- 云、AI、5G技术融合,会将移动互联网带到什么新高度?
- 解决博客园中代码着色问题
- Python-OpenCV人脸检测(代码)
- 如何获取21版0.3米分辨率全球卫星影像
- 虚幻4地形怎么增加层_虚幻周报20200512 | 该来的总会来的!
- 汉王手写板linux驱动下载,汉王笔手写板驱动程序
- 鸟哥的Linux私房菜(基础学习篇第四版)学习笔记
- matlab lte rsrp,为什么选择 FieldFox 手持式分析仪?- 更宽带宽,更高精度
- What is a hardlink and how to create one?
- xcode清理缓存_Mac 垃圾清理软件-腾讯柠檬Lemon
- 万彩办公大师多页PDF文档去掉空白部分合并到同一页
- android 代码控制TextView的字体加粗
- 【STM32Cube】学习笔记(二):超声波传感器