TAdoquery 关闭后,TCP连接还是一直建立,如果解决,谢谢
时间:2011-09-20
来源:互联网
我做了一个服务器,每个线程中动态创建一个ADOConnection与TAdoquery,以指向不同的数据库,当客户端数据量大时,发现有些查询失败,调试发现是数据库连接达到最大值,每个线程执行一个就会增加一个TCP连接,而且不会断开,也不会是close wait 状态,我在线程里面都关闭与释放了这两个对象,不找到为何出现这种情况。
当我只使用ADOConnection时,在线程中连接与关闭,TCP连接都会正常变为time wait,只要使用到TADOquery(使用连接字符串,或使用其他连接对象都一样),不管是close,free,destroy,都不能断开TCP连接,请问大家,这是为什么啊,是不是有什么配置,还是ole db驱动问题。
而且我用MYSQL与PostgresSQL都测试了,发现用到TADOquery都会出现TCP连接不断开的情况.
当我只使用ADOConnection时,在线程中连接与关闭,TCP连接都会正常变为time wait,只要使用到TADOquery(使用连接字符串,或使用其他连接对象都一样),不管是close,free,destroy,都不能断开TCP连接,请问大家,这是为什么啊,是不是有什么配置,还是ole db驱动问题。
而且我用MYSQL与PostgresSQL都测试了,发现用到TADOquery都会出现TCP连接不断开的情况.
作者: libincs007 发布时间: 2011-09-20
既然连接是由ADOConnection来进行,那么,不管TADOquery是打开或关闭,均不会影响由ADOConnection产生的连接状态。另外,为什么要“每个线程中动态创建一个ADOConnection”呢?共用一个不好吗?
作者: gzzai 发布时间: 2011-09-20
TADOConnection.Connected := False;
TADOConnection.KeepConnection := False;
LZ试过么?
TADOConnection.KeepConnection := False;
LZ试过么?
作者: funxu 发布时间: 2011-09-20
突然想起来以前用adoconnection建立连接时确实出现过问题,后来把connection释放再重建就搞定了
LZ释放adoconnection了也不能断开连接么?
LZ释放adoconnection了也不能断开连接么?
作者: funxu 发布时间: 2011-09-20
刚在网上查的希望对你有帮助
在程序中执行
ADOConnection.Connected:=False;的时候
在MSSQL下用sp_who2查看依然保持着连接,而要等待若干时间之后才真正的断开,但是程序退出的时候就直接断开连接了
ADO的底层技术是Com的组件技术OLE DB,一个进程当建立与数据库的连接后,即使调用Close方法,该进程的连接还是被缓冲断开的,一般情况下数据库的操作时不会停止太长时间,因此该技术在下一次建立连接是不需要任何开销的。 要真正断开连接的情况是进程退出,或太长时间没有操作(一般为5分钟左右或更长,视OLEDB提供者而定)。
由此推测初步解决方法:
1 关闭进程
2 kill spid
在Master数据库中建如下存储过程:
CreateProcedurekillspid(@dbnamevarchar(20))
as
begin
declare@sqlnvarchar(500)
declare@spidint
set@sql='declaregetspidcursorfor
selectspidfromsysprocesseswheredbid=db_id('''+@dbname+''')'
exec(@sql)
opengetspid
fetchnextfromgetspidinto@spid
while@@fetch_status<>-1
begin
exec('kill'+@spid)
fetchnextfromgetspidinto@spid
end
closegetspid
deallocategetspid
end
GO
执行此存储过程
UseMaster
Go
execkillspid'mydb'
在程序中执行
ADOConnection.Connected:=False;的时候
在MSSQL下用sp_who2查看依然保持着连接,而要等待若干时间之后才真正的断开,但是程序退出的时候就直接断开连接了
ADO的底层技术是Com的组件技术OLE DB,一个进程当建立与数据库的连接后,即使调用Close方法,该进程的连接还是被缓冲断开的,一般情况下数据库的操作时不会停止太长时间,因此该技术在下一次建立连接是不需要任何开销的。 要真正断开连接的情况是进程退出,或太长时间没有操作(一般为5分钟左右或更长,视OLEDB提供者而定)。
由此推测初步解决方法:
1 关闭进程
2 kill spid
在Master数据库中建如下存储过程:
CreateProcedurekillspid(@dbnamevarchar(20))
as
begin
declare@sqlnvarchar(500)
declare@spidint
set@sql='declaregetspidcursorfor
selectspidfromsysprocesseswheredbid=db_id('''+@dbname+''')'
exec(@sql)
opengetspid
fetchnextfromgetspidinto@spid
while@@fetch_status<>-1
begin
exec('kill'+@spid)
fetchnextfromgetspidinto@spid
end
closegetspid
deallocategetspid
end
GO
执行此存储过程
UseMaster
Go
execkillspid'mydb'
作者: funxu 发布时间: 2011-09-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28