TAdoquery 关闭后,TCP连接还是一直建立,如果解决,谢谢

goodboyiceli 2011-09-20 12:00:07
我做了一个服务器,每个线程中动态创建一个ADOConnection与TAdoquery,以指向不同的数据库,当客户端数据量大时,发现有些查询失败,调试发现是数据库连接达到最大值,每个线程执行一个就会增加一个TCP连接,而且不会断开,也不会是close wait 状态,我在线程里面都关闭与释放了这两个对象,不找到为何出现这种情况。
当我只使用ADOConnection时,在线程中连接与关闭,TCP连接都会正常变为time wait,只要使用到TADOquery(使用连接字符串,或使用其他连接对象都一样),不管是close,free,destroy,都不能断开TCP连接,请问大家,这是为什么啊,是不是有什么配置,还是ole db驱动问题。
而且我用MYSQL与PostgresSQL都测试了,发现用到TADOquery都会出现TCP连接不断开的情况.
...全文
170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
monday 2011-09-30
  • 打赏
  • 举报
回复
我也碰到这个问题,ADOQuery.close后再关闭ADOCONNECTION和FREE,情况一样。即使是共用一个ADOCONNECTION也是这样的情况。
aigo_1984 2011-09-21
  • 打赏
  • 举报
回复
你在关闭的时候,要先执行adoquery.close这句,然后再设置adoconnection.connected:=false;
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'
funxu 2011-09-20
  • 打赏
  • 举报
回复
突然想起来以前用adoconnection建立连接时确实出现过问题,后来把connection释放再重建就搞定了
LZ释放adoconnection了也不能断开连接么?
funxu 2011-09-20
  • 打赏
  • 举报
回复
TADOConnection.Connected := False;
TADOConnection.KeepConnection := False;
LZ试过么?
广州佬 2011-09-20
  • 打赏
  • 举报
回复
既然连接是由ADOConnection来进行,那么,不管TADOquery是打开或关闭,均不会影响由ADOConnection产生的连接状态。另外,为什么要“每个线程中动态创建一个ADOConnection”呢?共用一个不好吗?
goodboyiceli 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 funxu 的回复:]

突然想起来以前用adoconnection建立连接时确实出现过问题,后来把connection释放再重建就搞定了
LZ释放adoconnection了也不能断开连接么?
[/Quote]
恩,首先adoconnection.connected:=false,然后free,TCP连接一直存在,其实那个连接是adoquery.open造成的,我说过,如果不使用adoquery,是可以正常关闭的
goodboyiceli 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 funxu 的回复:]

TADOConnection.Connected := False;
TADOConnection.KeepConnection := False;
LZ试过么?
[/Quote]
试过,TCP连接还是建立的
goodboyiceli 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzzai 的回复:]

既然连接是由ADOConnection来进行,那么,不管TADOquery是打开或关闭,均不会影响由ADOConnection产生的连接状态。另外,为什么要“每个线程中动态创建一个ADOConnection”呢?共用一个不好吗?
[/Quote]
不能共用一个,因为我的连接是指向不同的设备,而且数据库也不相同,实际是每打开一次Query会增加一次TCP的连接,谢谢你的回复

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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