首先要说明的是连接数是有限制的:

代码如下:

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

为什么要关闭数据库连接,可以不关闭吗?相关推荐

  1. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  2. EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响...

    数据库 我们先在SQL Server数据库中建立一个Book表: CREATE TABLE [dbo].[Book]([ID] [int] IDENTITY(1,1) NOT NULL,[BookNa ...

  3. JDBC 关闭数据库连接与自动提交

    // Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...

  4. 正确及时关闭数据库连接

    1.1  概述 在JAVAEE后台编码时,时常出现没有正确及时关闭数据库连接资源(Connection,Statement, ResultSet)现象,导致程序运行过程中出现意想不到的错误. 本文档首 ...

  5. Android关掉多个activity,Android应用开发之Android Activity栈管理 制定关闭某一个Activity,关闭所有Activit...

    本文将带你了解Android应用开发之Android Activity栈管理  制定关闭某一个Activity,关闭所有Activit,希望本文对大家学Android有所帮助. 系统Api :打开新的 ...

  6. 热启动必须联网吗_供暖结束,地暖是关闭供水阀门还是关闭回水阀门?你做对了吗?...

    天气渐渐暖和起来 很多城市都停止供暖了 一些家庭也停止使用地暖 那么今天就来聊一聊,停止供暖后 地暖系统应该怎么保养 地暖不用时候是关闭供水阀门还是关闭回水阀门? 供暖结束 暖气阀门到底要不要关 一般 ...

  7. java 关闭时_java – 活动关闭时服务停止

    我已经阅读了一些与这个问题相关的答案,它们似乎都是一样的: "使用START_STICKY运行您的服务" "在前台运行您的服务" "使用startSe ...

  8. linux 关闭自动升级,开启关闭Centos的自动更新(转)

    开启关闭Centos的自动更新 关闭Centos的自动更新,操作记录如下: [[email protected] alpha]# chkconfig –list yum-updatesd yum-up ...

  9. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    原文:WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭 在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而 ...

  10. java io流不关闭_Java IO流关闭问题的深入研究

    前几天看了一篇文章(见参考文章),自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题: 包装流的close方法是否会自动关闭被包装的流? 关闭流方法是否有顺序? 包装流的close ...

最新文章

  1. 华为harmonyos和ios,华为EMUI正式更名为HarmonyOS,看来华为真的是孤注一掷了
  2. 推荐8个私藏已久的实用网站,每一款都能带来惊喜!
  3. ant 编译java 项目_使用ant编译打包、部署简单的javaweb项目 --01
  4. 鸟哥的linux私房菜有乌班图,折腾Ubuntu的一些summary--初装Ubuntu18和重装Ubuntu18
  5. 「Luogu」[JSOI2007]字符加密 解题报告
  6. 【转】unity开发android游戏(一)搭建Unity安卓开发环境
  7. 解决mysql“Access denied for user 'root'@'localhost'”
  8. 云、AI、5G技术融合,会将移动互联网带到什么新高度?
  9. 解决博客园中代码着色问题
  10. Python-OpenCV人脸检测(代码)
  11. 如何获取21版0.3米分辨率全球卫星影像
  12. 虚幻4地形怎么增加层_虚幻周报20200512 | 该来的总会来的!
  13. 汉王手写板linux驱动下载,汉王笔手写板驱动程序
  14. 鸟哥的Linux私房菜(基础学习篇第四版)学习笔记
  15. matlab lte rsrp,为什么选择 FieldFox 手持式分析仪?- 更宽带宽,更高精度
  16. What is a hardlink and how to create one?
  17. xcode清理缓存_Mac 垃圾清理软件-腾讯柠檬Lemon
  18. 万彩办公大师多页PDF文档去掉空白部分合并到同一页
  19. android 代码控制TextView的字体加粗
  20. 【STM32Cube】学习笔记(二):超声波传感器

热门文章

  1. 破解电信光猫RG2010-CA超级管理员账号
  2. 如何看待绿色数据中心
  3. laravel composer 安装指定版本以及基本的配置
  4. Ubuntu使用记录:安装deb软件方法以及apt、apt-get和dpkg的区别
  5. Mybatis ResultMap Collection 复合主键
  6. CF321E Ciel and Gondolas BZOJ 5311 贞鱼
  7. NSMutableString基本概念
  8. [转载]窗口之间的主从关系与Z-Order
  9. redis学习总结2
  10. 悲剧,当用cywin 写Linux脚本