C# 使用Using块后,MySql连接数还会增加的问题

loveljy_19901114 2018-06-19 10:47:01
本文使用采用UDP和TCP分别接收大约十几个不同的异步传感器发送过来的数据,然后将这些数据写入MySQL 数据库中,传感器每隔几分钟发送过来一次数据。
在C# 代码中,一接收到数据就起一个线程来处理接收到的数据,然后将数据插入数据库中,我们使用Using块来释放MySql资源,代码如下:
using (MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(MainForm.connStr))
{
conn.Open();
using (MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand())
{
cmd.CommandTimeOut=50; //这一句执行一些费时操作时会有,不费时操作处没有
cmd.Connection = conn;
cmd.CommandText="执行语句";
cmd.ExecuteNonQuery();
}
}

现在出现的问题如下:
刚开始运行程序的时候,cmd下使用netstat -ano命令,可以发现,本地的Mysql连接有三个,之后随着程序的运行,过了两天,mysql连接变成了7个,之前的三个还在,然后再过了三天,mysql连接变成了16个,之前的7也还在,感觉mysql连接会一直增加下去,我想问一下造成这种问题的可能的原因是什么,我应该怎么修改程序?
...全文
779 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2018-07-06
  • 打赏
  • 举报
回复
mysql服务器上的wait_timeout设置控制服务器端连接池里的连接的生命期,默认是8个小时。客户端释放了连接之后在wait_timeout内重连的话,可以免去创建连接的时间。如果你的设备发送频率是高于每wait_timeout一次的话,每个设备一个连接才是正常的。
  • 打赏
  • 举报
回复
引用 13 楼 xuzuning 的回复:
这 16个连接 超过了你的设备数了吗?
没有超过的话,有什么可担心的呢?


是这样的。这说明连接缓存很稳定。
  • 打赏
  • 举报
回复
引用 14 楼 u011017980 的回复:
conn为什么不close并dispose掉呢,using不会主动去关闭链接的


什么叫做“dispose掉”呢?GC 释放对象存储,那是 GC 的事情,也不是什么 dispose 的事情。

"dispose掉“这其实是标题党。

dispose 方法里边会自动调用 close,并不需要手动调用 close。dispose 不过是一个普通方法,没有什么”掉“不”掉“的。
小数点666 2018-07-05
  • 打赏
  • 举报
回复
嗯呢,close会处理链接状态,如果这个链接里有一些事一直在占用资源,那么即使using了,这个资源也dispose不了,你在里边close一下,应该就好了
小数点666 2018-07-04
  • 打赏
  • 举报
回复
conn为什么不close并dispose掉呢,using不会主动去关闭链接的
  • 打赏
  • 举报
回复
引用 14 楼 u011017980 的回复:
conn为什么不close并dispose掉呢,using不会主动去关闭链接的

真的吗?
xuzuning 2018-06-21
  • 打赏
  • 举报
回复
这 16个连接 超过了你的设备数了吗?
没有超过的话,有什么可担心的呢?
loveljy_19901114 2018-06-21
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
再过了三天,mysql连接变成了16个,之前的7也还在

这话说的有意思,你如何分辨出其中哪 7 个是昨天的?

接收大约十几个不同的异步传感器发送过来的数据,且 每隔几分钟发送过来一次数据

每隔几分钟,就算是 10分钟吧,每天也要有 144 次连接,何况是十几台设备呢
可见连接是被正常关闭了的!
若这十几台设备恰好同时在发送数据,那么出现十几个连接又有何不可呢?(这么忖,就被你看到了)

如果是短连接,连接数多于设备数,才算是出现了问题(还要刨去第三方访问)
如果是长连接,只要不超限,都是正常的

是通过命令行下netstat -ano查看到本机端口号来确定的,之前用于连接数据库的端口号还在,我是用这个来分辨的,可能之前我说得不对,应该是之前的物理连接还在。

目前我使用的是都是短链接,短连接数要大于设备数,发帖子的时候是16个连接,过了两天,刚刚看了一下还是16个,也不增多也不减少,感觉还是有点问题,怕这个连接数会一直增加
xuzuning 2018-06-21
  • 打赏
  • 举报
回复
再过了三天,mysql连接变成了16个,之前的7也还在

这话说的有意思,你如何分辨出其中哪 7 个是昨天的?

接收大约十几个不同的异步传感器发送过来的数据,且 每隔几分钟发送过来一次数据

每隔几分钟,就算是 10分钟吧,每天也要有 144 次连接,何况是十几台设备呢
可见连接是被正常关闭了的!
若这十几台设备恰好同时在发送数据,那么出现十几个连接又有何不可呢?(这么忖,就被你看到了)

如果是短连接,连接数多于设备数,才算是出现了问题(还要刨去第三方访问)
如果是长连接,只要不超限,都是正常的

  • 打赏
  • 举报
回复
“只有在现有的物理连接全部被占用的情况下才会新起一个物理连接”这个话其实应该反过来理解,当使用过连接池一段时间之后,高峰时占用了十几个物理连接并不会随后立刻释放,而是会缓存一段时间。
  • 打赏
  • 举报
回复
引用 6 楼 loveljy_19901114 的回复:
您的意思是我这边目前十几个连接是没问题的是吗?


至少这还不算是测试出bug。你并发十几个任务,运行一段时间之后完全可能集中在一起(一小段时间内集中)访问,连接池不会那么快地把冗余的物理连接释放掉。因此不能说十几个连接超出了连接池应该缓存的连接数量。
  • 打赏
  • 举报
回复
loveljy_19901114 2018-06-19
  • 打赏
  • 举报
回复
处理数据的线程是短线程,处理完数据之后这个线程就关了
loveljy_19901114 2018-06-19
  • 打赏
  • 举报
回复
希望有经验的大神帮忙指点一下,只要是可能的原因就行
angel6709 2018-06-19
  • 打赏
  • 举报
回复
调用Close()
loveljy_19901114 2018-06-19
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
所谓“使用Using块来释放MySql资源”,许多人都是爱说“释放资源”但是根本不去理解到底释放什么资源?这就是标题党。 逻辑连接跟物理连接是不同级别的东西。数据库物理连接并不会被 Using 释放,而是放回连接池中。所以这里的“及时释放”就是高效率地共享数据库连接。相反地那种弄个什么 static 的连接对象之类的做法,是不知道如何真正让多连接需求去共享连接的。
您的意思是我这边目前十几个连接是没问题的是吗? 所谓的使用static关键字只是建立了一个静态长连接,并不是多个连接来共享物理连接。 使用using块释放的资源只是释放的逻辑连接,而物理连接还在,如果再起一个逻辑连接的话,这个逻辑连接还是调用的目前存在的物理连接,只有在现有的物理连接全部被占用的情况下才会新起一个物理连接
  • 打赏
  • 举报
回复
所谓“使用Using块来释放MySql资源”,许多人都是爱说“释放资源”但是根本不去理解到底释放什么资源?这就是标题党。 逻辑连接跟物理连接是不同级别的东西。数据库物理连接并不会被 Using 释放,而是放回连接池中。所以这里的“及时释放”就是高效率地共享数据库连接。相反地那种弄个什么 static 的连接对象之类的做法,是不知道如何真正让多连接需求去共享连接的。
  • 打赏
  • 举报
回复
每隔几分钟(之内)就有 10 几个连接,运行了几天之后才缓存 10 几个连接,这本身就说明连接池可以啊。 如果连接池失效,那么1小时就达到200个连接了。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧