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

发布时间:2026/10/14 13:17:31
首先要说明的是连接数是有限制的: 代码如下span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000fffor/span (span stylecolor:#0000ffint/span i 0; i 10000; i) { SqlConnection conn span stylecolor:#0000ffnew/span SqlConnection(span stylecolor:#006080Data Source.\SQLEXPRESS; AttachDbFilename/spanspan stylecolor:#006080E:\DB\NORTHWND.mdf/spanspan stylecolor:#006080; Integrated SecurityTrue;Connect Timeout30;User InstanceTrue/span); conn.Open(); Console.WriteLine(span stylecolor:#006080打开了{0}个连接/span, i); }/span/span运行结果如下过一会就会提示打开连接超时了可以看到数据库连接时有限制的如果连接不关闭而且使用的人比较多那么系统很快就down掉了。但是有时候由于某些原因应用程序可能只是几个人使用所以就有人设计了在应用程序启动的时候打开数据库连接在应用程序关闭的时候关闭数据库连接那么使用这种方式有什么问题呢首先假设有一张表Nums表定义如下Main代码如下span stylecolor:#000000span stylebackground-color:#ffffffSqlConnection conn span stylecolor:#0000ffnew/span SqlConnection(span stylecolor:#006080Data Source.\SQLEXPRESS; AttachDbFilename/spanspan stylecolor:#006080E:\DB\NORTHWND.mdf/spanspan stylecolor:#006080; Integrated SecurityTrue;Connect Timeout30;User InstanceTrue/span); conn.Open(); Parallel.For(1, 9999, (id) { ExecuteCommand(conn, id); });/span/spanspan stylecolor:#000000span stylebackground-color:#ffffff /span/span就是从1到9999开始执行ExecuteCommandExecuteCommand代码如下span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffprivate/span span stylecolor:#0000ffstatic/span span stylecolor:#0000ffvoid/span ExecuteCommand(SqlConnection conn, span stylecolor:#0000ffint/span id) { Console.WriteLine(span stylecolor:#006080正在执行./span id); Thread.Sleep(100); SqlCommand cmd span stylecolor:#0000ffnew/span SqlCommand( span stylecolor:#0000ffstring/span.Format(span stylecolor:#006080Insert into Nums values({0}) /span, id), conn); cmd.ExecuteNonQuery(); }/span/span运行可以看到ExecuteNonQuery方法抛出了异常原因是连接处于关闭状态。可是我们的连接一直都是open着的啊并没有调用closedispose之类的方法啊。于是在ExecuteCommand前面增加判断条件span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffif/span (conn.State ! System.Data.ConnectionState.Open) conn.Open();/span/span再次运行可以看到还是会出现连接已关闭的问题。你知道什么原因吗这里是由于多线程环境引起的。所以需要加锁。privatestaticobjectsyncObj newobject();privatestaticvoidExecuteCommand(SqlConnection conn,intid){lock(syncObj){if(conn.State ! System.Data.ConnectionState.Open)conn.Open();Console.WriteLine(正在执行.. id);Thread.Sleep(100);SqlCommand cmd newSqlCommand(string.Format(Insert into Nums values({0}), id), conn);cmd.ExecuteNonQuery();}}再次运行可以发现基本没问题了.修改Parallel.For的最大值上限要测试下是否可以长期执行了。Parallel.For(1, Int32.MaxValue, (id) {ExecuteCommand(conn, id);});

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询