精易论坛

标题: Mysql在线程中链接操作完成后句柄无限增加 [打印本页]

作者: 超级萌新    时间: 2021-11-27 14:33
标题: Mysql在线程中链接操作完成后句柄无限增加
Mysql在线程中链接操作完成后句柄无限增加
1连接MySql(),无论链接是否成功,句柄数都会增加一个;
2.链接成功后正常断开sql了,没有链接成功的没有进行断开;
3.链接成功后无论是否增删改查或者不操作都会出现这个问题;
4.链接失败也会出现这个问题;
5.这个问题只有在线程内会出现,非线程不会增加;

保留线程句柄,手动使用  线程_销毁()来销毁也无用;


想知道原因是什么,怎么才能解决,是否是易语言版本和系统的问题;
系统windows10专业版最新版-易语言是5.9







补充内容 (2021-11-27 14:57):
我想知道的是在线程中如何避免句柄数无限增值的问题

补充内容 (2021-11-27 15:28):
线程已经结束了,是句柄增加了一个,任务管理器里面的句柄

我测试了执行10万次操作,句柄数叠加到了8万多,难道这个句柄无所谓吗,不影响还是啥

补充内容 (2021-11-27 16:51):
句柄数查看方法:调试输出 (“句柄数:”, 进程_取句柄数 (进程_取自进程ID ()))

补充内容 (2021-11-27 18:08):
此问题使用PHP中间件解决,我想知道不用线程池和中间件的解决方法

补充内容 (2021-12-1 08:36):
建立自己的三观,不要什么都无条件相信,圣人也有犯错的时候,有问题要学会找问题,而不是自我怀疑,自我否定;不要去强行解释、避开问题,才会进步;

补充内容 (2021-12-3 11:54):
个人认为是Mysql支持库本身的问题
作者: 超级萌新    时间: 2021-11-27 14:42
为了方便测试,只放链接失败的代码吧,链接成功也是一样的,只要在线程内链接就会增加句柄而且不会消失


  
子程序名返回值类型公开备 注
_按钮1_被单击  
启动线程 (&子程序1, , )
子程序名返回值类型公开备 注
子程序1  
变量名类 型静态数组备 注
SQL句柄整数型 
SQL句柄 = 连接MySql (“127.0.0.1”, “123”, “456”, “789”, 到整数 ( #浏览量数据库端口 ))
调试输出 (SQL句柄)


i支持库列表   支持库注释   
EThread多线程支持库
mysqlMySql支持库
spec特殊功能支持库

补充内容 (2021-11-27 15:16):
如果将:“_按钮1_被单击”下面启动线程 (&子程序1, , )换成:子程序1()  就不会有问题

补充内容 (2021-11-27 16:33):
windows7环境下测试问题依然存在,编译后也有
作者: 原子    时间: 2021-11-27 14:46
为什么要一直去连接呢?只连接一次不就行了
作者: 超级萌新    时间: 2021-11-27 14:51
原子 发表于 2021-11-27 14:46
为什么要一直去连接呢?只连接一次不就行了

因为线程数量大多线程用一个会出问题,而且慢
作者: sinewtec    时间: 2021-11-27 14:53
mysql池 先连接一定数量 调用句柄就好 最后一起销毁!
作者: 超级萌新    时间: 2021-11-27 14:56
sinewtec 发表于 2021-11-27 14:53
mysql池 先连接一定数量 调用句柄就好 最后一起销毁!

我想知道的是在线程中如何避免句柄数无限增值的问题
作者: 超级萌新    时间: 2021-11-27 14:56
@大司命 大佬有啥方法吗
作者: 超级萌新    时间: 2021-11-27 14:57


作者: 超级萌新    时间: 2021-11-27 15:00
@初夏喔 @大司命 @番茄吧 @nikezhi @AnyPopup @七彩色工作室 @zuoshoudidi @寒潮 @影知 @铃儿响叮当

大佬们 ,求教

作者: 鹏书    时间: 2021-11-27 15:09
xiaohui49816 发表于 2021-11-27 15:00
@初夏喔 @大司命 @番茄吧 @nikezhi @AnyPopup @七彩色工作室 @zuoshoudidi @寒潮 @影知 @铃儿响叮当

大佬 ...

用线程池肯定是最好的。但是你上面说想知道怎么解决这个问题,那个链接失败你怎么判断出来句柄增加了?你应该获取不到句柄,如果能获取到句柄你就可以断开了
作者: Suky    时间: 2021-11-27 15:09
有可能是线程创建时候判定条件的问题
我之前就闹过这样的乌龙,你先检查一下
看看是不是创建了多个线程然后存储句柄的变量内容被下一次创建的线程句柄替换掉了

这是我闹乌龙求助的帖:
线程内执行循环,每个循环周期内为什么执行两次子程序?
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14708030
(出处: 精易论坛)


补充内容 (2021-11-27 15:12):
先检查线程是否额外创建了而你没发现,然后再检查连接失败后是否有正确的命令判断和销毁线程
作者: 超级萌新    时间: 2021-11-27 15:12
nikezhi 发表于 2021-11-27 15:09
用线程池肯定是最好的。但是你上面说想知道怎么解决这个问题,那个链接失败你怎么判断出来句柄增加了?你 ...

我说的句柄是系统内的句柄:
https://125.confly.eu.org/forum.php?mod ... 19&pid=22419270
作者: 超级萌新    时间: 2021-11-27 15:15
铃儿响叮当 发表于 2021-11-27 15:09
有可能是线程创建时候判定条件的问题
我之前就闹过这样的乌龙,你先检查一下
看看是不是创建了多个线程然后 ...

我这里好像没有任何判断啊
  
子程序名返回值类型公开备 注
_按钮1_被单击  
启动线程 (&子程序1, , )
子程序名返回值类型公开备 注
子程序1  
变量名类 型静态数组备 注
SQL句柄整数型 
' 这里随便填的,我测试了链接成功和链接失败都是会增加句柄
SQL句柄 = 连接MySql (“127.0.0.1”, “123”, “456”, “789”, 66666)
调试输出 (SQL句柄)


i支持库列表   支持库注释   
EThread多线程支持库
mysqlMySql支持库
spec特殊功能支持库


测试图:
https://125.confly.eu.org/forum.php?mod ... 19&pid=22419270

作者: Suky    时间: 2021-11-27 15:22
xiaohui49816 发表于 2021-11-27 15:15
我这里好像没有任何判断啊
[e=0].版本 2
.支持库 EThread

这段代码测试了没问题啊,没创建数据库,连接就失败   句柄就只有一个0
作者: Suky    时间: 2021-11-27 15:24
xiaohui49816 发表于 2021-11-27 14:42
为了方便测试,只放链接失败的代码吧,链接成功也是一样的,只要在线程内链接就会增加句柄而且不会消失

试一下,线程引用子程序里,执行完成后就销毁线程吧
线程没销毁的话,会不会自动循环?虽然我没见过
作者: lijiqidong    时间: 2021-11-27 15:26
要用数据库连接池
作者: 超级萌新    时间: 2021-11-27 15:26
铃儿响叮当 发表于 2021-11-27 15:24
试一下,线程引用子程序里,执行完成后就销毁线程吧
线程没销毁的话,会不会自动循环?虽然我没见过{:4_2 ...

我测试了保留线程句柄,完成或手动使用线程_销毁来销毁,但是句柄数依然增加

这个问题是我在一堆代码里面,排除法,找到的最终代码了,实在是找不到其他问题了,手动销毁都销毁不掉

补充内容 (2021-11-27 15:27):
线程结束了,但是句柄多了一个
作者: Suky    时间: 2021-11-27 15:30
如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数 new_link 改变此行为,并使 mysql_connect() 总是打开新的连接甚至当 mysql_connect() 曾在前面被用同样的参数调用过。参数 client_flags 可以是以下常量的组合:MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。

cha询函数的时候看到这一段,不确定是否有用,对这个不是很理解
作者: sinewtec    时间: 2021-11-27 15:42
库肯定是没啥问题 你写法问题把!贴代码出来!
作者: 超级萌新    时间: 2021-11-27 16:00
sinewtec 发表于 2021-11-27 15:42
库肯定是没啥问题 你写法问题把!贴代码出来!

https://125.confly.eu.org/forum.php?mod ... 19&pid=22419189
作者: 超级萌新    时间: 2021-11-27 16:02
sinewtec 发表于 2021-11-27 15:42
库肯定是没啥问题 你写法问题把!贴代码出来!

说真的,最好的结果是我的写法有问题,那样我就可以解决问题了;
作者: 帅气与大侠    时间: 2021-11-27 16:04
检测所有步骤,肯定是你没有释放对应资源,连接mysql后,有sql句柄,查找记录集有记录集句柄,都要顺序释放,最后断开mysql
作者: sinewtec    时间: 2021-11-27 16:09
xiaohui49816 发表于 2021-11-27 16:02
说真的,最好的结果是我的写法有问题,那样我就可以解决问题了;

你确定你泄露句柄的 是MYSQL库的 还是线程的
作者: 超级萌新    时间: 2021-11-27 16:10
sinewtec 发表于 2021-11-27 16:09
你确定你泄露句柄的 是MYSQL库的 还是线程的

这个程序只有这几行代码,我不确定是不是我电脑有问题,我测试了3个电脑,都是这个问题;
我不确定到底是什么的问题,所以我想知道
作者: sinewtec    时间: 2021-11-27 16:30
xiaohui49816 发表于 2021-11-27 16:10
这个程序只有这几行代码,我不确定是不是我电脑有问题,我测试了3个电脑,都是这个问题;
我不确定到底是 ...

你不要管库返回是不是0 都要调用断开连接释放资源
作者: sinewtec    时间: 2021-11-27 16:41
.版本 2
.支持库 EThread
.支持库 mysql

.子程序 _按钮1_被单击
.局部变量 cc, 整数型

启动线程 (&子程序1, , cc)
关闭线程句柄 (cc)

.子程序 子程序1
.局部变量 SQL句柄, 整数型

SQL句柄 = 连接MySql (“127.0.0.1”, “123”, “456”, “789”, 3306)
断开MySql (SQL句柄)

作者: 超级萌新    时间: 2021-11-27 16:43
sinewtec 发表于 2021-11-27 16:09
你确定你泄露句柄的 是MYSQL库的 还是线程的

sinewtec 我说的是句柄增长,不是断开不断开的问题

看句柄数的方法:调试输出 (进程_取句柄数 (进程_取自进程ID ()))
作者: 超级萌新    时间: 2021-11-27 16:46
sinewtec 发表于 2021-11-27 16:09
你确定你泄露句柄的 是MYSQL库的 还是线程的
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
线程句柄整数型  

子程序名返回值类型公开备 注
_按钮1_被单击  
启动线程 (&子程序1, , )
子程序名返回值类型公开备 注
子程序1  
变量名类 型静态数组备 注
SQL句柄整数型 
SQL句柄 = 连接MySql (“127.0.0.1”, “123”, “456”, “789”, 66666)
断开MySql (SQL句柄)
调试输出 (“线程执行完成”, 进程_取句柄数 (进程_取自进程ID ()))


i支持库列表   支持库注释   
EThread多线程支持库
mysqlMySql支持库
spec特殊功能支持库



执行结果:


* “线程执行完成” | 398
* “线程执行完成” | 399
* “线程执行完成” | 400
* “线程执行完成” | 401
* “线程执行完成” | 402
* “线程执行完成” | 403
* “线程执行完成” | 404
* “线程执行完成” | 405
* “线程执行完成” | 408
* “线程执行完成” | 409
* “线程执行完成” | 410
* “线程执行完成” | 411
* “线程执行完成” | 412
* “线程执行完成” | 413
* “线程执行完成” | 415
* “线程执行完成” | 416
* “线程执行完成” | 417
* “线程执行完成” | 418
* “线程执行完成” | 419
* “线程执行完成” | 420
* “线程执行完成” | 421


作者: 超级萌新    时间: 2021-11-27 16:47
aqwvwv 发表于 2021-11-27 16:04
检测所有步骤,肯定是你没有释放对应资源,连接mysql后,有sql句柄,查找记录集有记录集句柄,都要顺序释放 ...

感觉你来回答问题,但是麻烦您测试一下再说这些;

补充内容 (2021-11-27 16:53):
或者稍微看一下我说的
作者: 超级萌新    时间: 2021-11-27 16:49
sinewtec 发表于 2021-11-27 16:41
.版本 2
.支持库 EThread
.支持库 mysql



测试代码:

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
cc整数型 
启动线程 (&子程序1, , cc)
关闭线程句柄 (cc)
调试输出 (“测试句柄数:”, 进程_取句柄数 (进程_取自进程ID ()))
子程序名返回值类型公开备 注
子程序1  
变量名类 型静态数组备 注
SQL句柄整数型 
SQL句柄 = 连接MySql (“127.0.0.1”, “123”, “456”, “789”, 3306)
断开MySql (SQL句柄)


i支持库列表   支持库注释   
EThread多线程支持库
spec特殊功能支持库
mysqlMySql支持库


测试结果:
* “测试句柄数:” | 396
* “测试句柄数:” | 397
* “测试句柄数:” | 401
* “测试句柄数:” | 402
* “测试句柄数:” | 403
* “测试句柄数:” | 404
* “测试句柄数:” | 405
* “测试句柄数:” | 409
* “测试句柄数:” | 413
* “测试句柄数:” | 417
* “测试句柄数:” | 418
* “测试句柄数:” | 422
* “测试句柄数:” | 426
* “测试句柄数:” | 430
* “测试句柄数:” | 434
* “测试句柄数:” | 435
* “测试句柄数:” | 439
* “测试句柄数:” | 440
* “测试句柄数:” | 444
* “测试句柄数:” | 445
* “测试句柄数:” | 446
* “测试句柄数:” | 447
* “测试句柄数:” | 451
* “测试句柄数:” | 452
* “测试句柄数:” | 453
* “测试句柄数:” | 454
* “测试句柄数:” | 455


作者: 小书    时间: 2021-11-27 18:11
论坛里mysql这么好的连接池不用一下吗?
作者: 超级萌新    时间: 2021-11-27 18:53
小书 发表于 2021-11-27 18:11
论坛里mysql这么好的连接池不用一下吗?

我用中间件,我是想知道原因,不是避开原因
作者: Suky    时间: 2021-11-27 19:40
xiaohui49816 发表于 2021-11-27 18:53
我用中间件,我是想知道原因,不是避开原因

就像我那个双线程乌龙
执着于寻找答案才会进步
作者: wwj001    时间: 2021-11-30 06:52
你是不是还有时钟

作者: 超级萌新    时间: 2021-11-30 10:00
wwj001 发表于 2021-11-30 06:52
你是不是还有时钟

没有任何其他的代码

2楼是所有的代码
作者: wwj001    时间: 2021-11-30 21:13
xiaohui49816 发表于 2021-11-30 10:00
没有任何其他的代码

2楼是所有的代码

那就不是这个地方的问题吧
我测试了你2楼的那个代码
不会产生句柄无限叠加的情况
我之前遇到过,是时钟嵌套,线程_启动才出现这种情况
你应该是其他地方出的问题,单纯的这个代码怎么会出问题
作者: wwj001    时间: 2021-11-30 21:21
wwj001 发表于 2021-11-30 21:13
那就不是这个地方的问题吧
我测试了你2楼的那个代码
不会产生句柄无限叠加的情况

是不是代码有做改动,你这个应该是一直在进行MySQL创建连接,每次链接会产生的新的句柄,然后你又没有设置断开MySQL,句柄会一直增加。
你这个代码根本就是没有调用多线程
作者: 超级萌新    时间: 2021-12-1 08:29
wwj001 发表于 2021-11-30 21:21
是不是代码有做改动,你这个应该是一直在进行MySQL创建连接,每次链接会产生的新的句柄,然后你又没有设 ...

https://125.confly.eu.org/forum.php?mod ... 19&pid=22419841

补充内容 (2021-12-1 08:30):
看一下30楼

补充内容 (2021-12-1 08:30):
还有问题的补充

补充内容 (2021-12-1 08:31):
句柄数查看方法:调试输出 (“句柄数:”, 进程_取句柄数 (进程_取自进程ID ()))
作者: 超级萌新    时间: 2021-12-1 08:34
wwj001 发表于 2021-11-30 21:13
那就不是这个地方的问题吧
我测试了你2楼的那个代码
不会产生句柄无限叠加的情况

建立自己的三观,不要什么都无条件信任,有问题要学会找问题,而不是自我怀疑;
还有要学会审题,启动线程也是线程,不是只有线程_启动才是线程
作者: wwj001    时间: 2021-12-1 18:15
xiaohui49816 发表于 2021-12-1 08:34
建立自己的三观,不要什么都无条件信任,有问题要学会找问题,而不是自我怀疑;
还有要学会审题,启动线 ...

是你自己没看清楚我说的意思
作者: 超级萌新    时间: 2021-12-1 21:21
wwj001 发表于 2021-12-1 18:15
是你自己没看清楚我说的意思

对不起,我看不懂内涵,我只会看字面的意思
作者: wwj001    时间: 2021-12-1 21:26
xiaohui49816 发表于 2021-12-1 21:21
对不起,我看不懂内涵,我只会看字面的意思

没什么内涵不内涵,你看不懂就是看不懂
作者: 超级萌新    时间: 2021-12-1 21:30
wwj001 发表于 2021-12-1 21:26
没什么内涵不内涵,你看不懂就是看不懂

你都看不懂我说的,我怎么可能看懂你说的
作者: 超级萌新    时间: 2021-12-1 22:01
wwj001 发表于 2021-12-1 21:26
没什么内涵不内涵,你看不懂就是看不懂

你的帖子:
1.        如何获取 某牛 右侧的买家访问商品足迹
·读内存
·劫包
·读窗口
2.VIP支持库_填表,如何取这里面的链接
·正则
·文本取
·填表取根据ID或标签样式
3.如何计算sign,求思路或者类似教程
·三个内容+一个时间戳拼接 然后用精易的命令校验_取sha1取一下
4.Win7正常,Win10就会闪退!!!
·代码都没写,鬼知道
5.        代码重复问题,dll问题
·可以载入,调用dll时,直接加载到制定窗口句柄内就行;
·简单点直接窗口_置父;
6.        千牛_窗口_获取内容,获取消息数
·读内存;
·hook;
·读窗口信息;
都可以搞定,搞不定不代表他没有;
7.VIP支持库_填表求助_<em>标签后的内容,如何获取
·没用过vip支持库,不过都差不多,方法一大堆;
·支持库应该有自带的获取,不多说;
·根据em标签  class名获取  或者 id名获取,都可以,各种填表模块支持库都大同小异;
·或者直接文本取,或者正则取;
·也可以直接寻找,有就是有没有就没有了;
·路不是死的,人更不是死的;
8.win10误报问题,想解决,有企业资质,愿意付费
·你说的事自带的杀毒误报吧
·有人给你提供误报申诉接口了;
·写东西的时候少用点别人的模块;
·加壳加证书可以试试,但是效果一般;
·证书有很多免费的,比如制作安装包的时候生成等等;
·核心问题是少用点别人的模块,多自己实现功能;

提示:
1.学学内存吧,可以去看看给植物大战僵尸写辅助,你就能基本的了解怎么读内存了;
2.要有自己的三观,不要感觉自己很差,但是也不要感觉自己很厉害,要学会追寻根本,寻找问题,解决问题,而不是我认为我是对的,我认为他们是对的。我不管你们,反正我没事;
3.如果你想帮人解决问题,可以写上原因,可以写解决方法,可以写解决思路,但是前提是你要学会读题,不要无脑写一通,让别人无语,但是还得回复您,回复了,又说别人不懂。
4.算了,懒得说了
作者: uulive    时间: 2022-8-15 21:46
解决了没这问题一直都存在
作者: 雨纷飞    时间: 2023-7-30 03:35
受不了了,好几年了还是有这个问题哈?我刚也遇到了.线程里连接mysql,即使什么都不做直接断开,句柄还是残留。明显是官方支持库有虫。
打算用vc写个mysql中间件的dll来绕过官方支持库。
作者: 超级萌新    时间: 2023-7-30 10:00
雨纷飞 发表于 2023-7-30 03:35
受不了了,好几年了还是有这个问题哈?我刚也遇到了.线程里连接mysql,即使什么都不做直接断开,句柄还是残留 ...

只能不在线程里面搞了
作者: 超级萌新    时间: 2023-7-30 10:01
uulive 发表于 2022-8-15 21:46
解决了没这问题一直都存在

可以看42楼的,他说我看不懂
作者: 超级萌新    时间: 2023-7-30 10:02
雨纷飞 发表于 2023-7-30 03:35
受不了了,好几年了还是有这个问题哈?我刚也遇到了.线程里连接mysql,即使什么都不做直接断开,句柄还是残留 ...

可以看42楼的,他说我看不懂
作者: 雨纷飞    时间: 2023-7-30 22:10
超级萌新 发表于 2023-7-30 10:02
可以看42楼的,他说我看不懂

你提供的测试源码已经极为精简了,他还弄不明白的话就不要跟他讨论了.
作者: 超级萌新    时间: 2023-7-31 10:52
雨纷飞 发表于 2023-7-30 22:10
你提供的测试源码已经极为精简了,他还弄不明白的话就不要跟他讨论了.

哦对了,用易语言写软件给客户的话,建议不要直连mysql,因为内存里面可以看到,所以建议直接写一个接口来用,php或者java go啥的写一个,放到服务器,我是这样的
作者: 小方叻    时间: 2023-9-12 15:00
顶一下,无意间发现这个问题 发现问题依然存在还没解决。虽然有替代方案 但是有时候就想看看咋回事。顶你一个
作者: 小方叻    时间: 2023-9-12 15:02
小方叻 发表于 2023-9-12 15:00
顶一下,无意间发现这个问题 发现问题依然存在还没解决。虽然有替代方案 但是有时候就想看看咋回事。顶你一 ...

因为我是采集数据用到的数据库,软件挂一天电脑就有点卡 后台发现200w+句柄 吓我一跳  目前自用用线程池代替用吧 后面不行在写api接口吧




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4