当前位置:  编程技术>c/c++/嵌入式

解析为何要关闭数据库连接,可不可以不关闭的问题详解

    来源: 互联网  发布时间:2014-10-13

    本文导语:  首先要说明的是连接数是有限制的: 代码如下: 代码如下:for (int i = 0; i < 10000; i++){    SqlConnection conn = new SqlConnection(@"Data Source=.SQLEXPRESS;                AttachDbFilename=""E:DBNORTHWND.mdf"";                Integrated Secur...

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

代码如下:

代码如下:

for (int i = 0; i < 10000; i++)
{
    SqlConnection conn = new SqlConnection(@"Data Source=.SQLEXPRESS;
                AttachDbFilename=""E:DBNORTHWND.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:DBNORTHWND.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#操作excel后关闭excel.exe的方法
  • 解析Android中如何做到Service被关闭后又自动启动的实现方法
  • 解析取模运算% 和位与运算& 之间的关系详解
  • 解析Linux系统中JVM内存2GB上限的详解
  • ThinkPHP3.1新特性之内容解析输出详解
  • 解析c++中的默认operator=操作的详解
  • 解析C#彩色图像灰度化算法的实现代码详解
  • 解析C#中@符号的几种使用方法详解
  • 解析后台进程对Android性能影响的详解
  • 解析Android开发优化之:对界面UI的优化详解(三)
  • 解析在内部循环中Continue外部循环的使用详解
  • 解析使用enumerator模式简化异步操作的详解
  • jQuery解析JSON数据实例详解
  • 解析Android开发优化之:对界面UI的优化详解(二)
  • 解析JAVA深度克隆与浅度克隆的区别详解
  • 解析jdbc处理oracle的clob字段的详解
  • 解析C#中的装箱与拆箱的详解
  • 解析C#中委托的同步调用与异步调用(实例详解)
  • 解析Runtime中shutdown hook的使用详解
  • DHCP:解析开发板上动态获取ip的2种实现方法详解
  • java Class文件内部结构解析过程详解
  • 深入多线程之:解析线程的交会(Thread Rendezvous)详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 解析abstract与override究竟可不可以同时使用
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • python下xml解析库lxml最新版下载安装以及代码示例
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • html中<checkbox>标签用法解析及如何设置checkbox复选框的默认选中状态
  • java 公式解析 表达式解析 expression-analyzer
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3