indy多线程创建ado连接,连接断开并释放后,sqlserver的连接不释放问题??? ( 积分: 138 )

  • 主题发起人 主题发起人 幸福鸟
  • 开始时间 开始时间

幸福鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
indy多线程创建ado连接,创建多个连接后,比如10个,发现sqlserver中有10个该数据库的连接,然后我清除几个连接,但发现sqlserver还是10个,并没释放,但当我把10个都Connection都释放后,sqlserver的连接却都释放了,是什么问题??<br>也就是说sqlserver中保留了最大数量创建的连接,直到这些连接都释放后才全部释放?<br><br>我使用的是1个udl连接sqlserver<br>indy控件名server<br><br>type<br>&nbsp;&nbsp;&nbsp;&nbsp;TSimpleClient&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;Cardinal;&nbsp;//系统编号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP:&nbsp;string;&nbsp;//IP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port:&nbsp;integer;&nbsp;//端口<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginTime:&nbsp;string;&nbsp;//登录时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateTime:&nbsp;string;&nbsp;//更新时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBackTime:&nbsp;Integer;&nbsp;//监控时间,&nbsp;超时则断开<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MYConn:&nbsp;TADOConnection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MYQuery:&nbsp;tadoquery;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;PMyClient&nbsp;=&nbsp;^TSimpleClient;<br><br>//有客户端连接<br>procedure&nbsp;TfrmShowMain.ServerConnect(AThread:&nbsp;TIdPeerThread);<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;Client:&nbsp;PMyClient;<br>&nbsp;&nbsp;&nbsp;&nbsp;list:&nbsp;TList;<br>&nbsp;&nbsp;&nbsp;&nbsp;i:&nbsp;integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Ret:&nbsp;DWord;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoInitialize(nil);&nbsp;//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;:=&nbsp;new(PMyClient);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.id&nbsp;:=&nbsp;AThread.ThreadID;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.IP&nbsp;:=&nbsp;AThread.Connection.Socket.Binding.PeerIP;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.Port&nbsp;:=&nbsp;AThread.Connection.Socket.Binding.PeerPort;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.LoginTime&nbsp;:=&nbsp;formatdatetime('yyyy-mm-dd&nbsp;HH:mm:ss',&nbsp;now);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.UpdateTime&nbsp;:=&nbsp;formatdatetime('yyyy-mm-dd&nbsp;HH:mm:ss',&nbsp;now);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AThread.Data&nbsp;:=&nbsp;Pointer(client);&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn&nbsp;:=&nbsp;TAdoconnection.create(nil);&nbsp;&nbsp;//创建的连接<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn.LoginPrompt&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn.KeepConnection&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn.ConnectionString&nbsp;:=&nbsp;'FILE&nbsp;NAME='&nbsp;+&nbsp;ExtractFileDir(application.ExeName)&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'/bjyy.udl';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYQuery&nbsp;:=&nbsp;tadoquery.Create(nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYQuery.Connection&nbsp;:=&nbsp;Client.MYConn;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn.Connected&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AThread.Connection.WriteLn('Welcome');<br>&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;E:&nbsp;Exception&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>//在某button&nbsp;click<br><br>procedure&nbsp;TfrmShowMain.BitBtn3Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;Client:&nbsp;PMyClient;<br>&nbsp;&nbsp;&nbsp;&nbsp;list:&nbsp;TList;<br>&nbsp;&nbsp;&nbsp;&nbsp;i:&nbsp;integer;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;server.Active&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;:=&nbsp;Server.Threads.LockList;<br>&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;List.Count&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;:=&nbsp;Pointer(TIdPeerThread(List.Items).Data);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Client&nbsp;=&nbsp;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;inttostr(Client.id)&nbsp;=&nbsp;listview1.Selected.Caption&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;//发现我要断开的ID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYQuery.Close;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYQuery.Free;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Client.MYConn.Connected&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeandnil(Client.MYConn);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIdPeerThread(List.Items).Connection.Disconnect;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIdPeerThread(List.Items).Data&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(Client);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoUnInitialize();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;E:&nbsp;Exception&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Server.Threads.UnlockList;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>请高人&nbsp;指点
 
有人知道么?
 
晕...了.//对一个数据库....你应该共用一个连接....你这样不行的
 
多个线程共用1个连接??可能会有问题<br><br>fishhead&nbsp;(2001-4-20&nbsp;10:24)&nbsp;<br>多个TADOQuery同时连接同一个TADOConnection是有问题的。<br>但是如果你这样做,不会马上得出冲突错误,因为这个错误是偶发性的。<br>原因如下:<br>TADOQuery在和sql&nbsp;server建立连接时,才会需要调用TADOConnection,<br>而TADOConnection所做的,仅仅是在connection缓冲池中为TADOQuery分配<br>一个可用的connection,这个操作是很短时间就可以完成的了,之后<br>TADOConnection就可以为其他TADOQuery服务了。<br>也就是说TADOConnection的临界区是很短的一瞬间,只有多个TADOQuery同时<br>访问这一临界区,才会有冲突。<br>比如:query1使用ADOConnection读取一个很大的表,需要几分钟时间,在这期间<br>query2无论如何使用ADOConnection,都不会发生冲突。<br>总之要明白一点,无论多个ADOQuery是连接一个TADOConnection,还是连接多个<br>TADOConnection,在后台的ado的connection缓冲池中,都是每个ADOQuery对应<br>一个connection的。&nbsp;<br><br><br>fishhead&nbsp;(2001-4-20&nbsp;10:54)&nbsp;<br>因为临界区时间很短,所以出问题的机会很小,但是还是会出问题。<br>我在5个线程中各用一个ADOQuery连接同一个ADOConnection,<br>每个ADOQuery平均每秒钟激活一次查询,运行1、2个小时后就会出错。<br>后来改成每个ADOQuery连接各自的ADOConnection,就运行一天都没问题。
 
anybody&nbsp;here
 
tO:幸福鸟&nbsp;<br>&nbsp;&nbsp;请留下你的msn我们可以沟通一下,&nbsp;msn:&nbsp;tiansoft68@hotmail.com
 
多个线程共用一个connection会除问题的,你可以对每一个线程用自己的connection
 
:—)聽過。只是不會。。
 
我现在就是创建多个连接
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
506
import
I
I
回复
0
查看
736
import
I
后退
顶部