自己写了一个库房管理系统,连接数据库用的都是ADOQuery,今天用SQL查询分析其执行exec sp_who 发现连接数好多啊,就我一个系统,进程就1000个!! 我猜可能是我写程序的原因
因为delphi里ADOQuery连接都是这样写的
先 close
然后 sql.clear sql.add
然后Open 估计连接数过多就是因为open以后没有close吧
但是刚才我open以后全部close了 ,sql连接进程还是那么多没变呀?请问高手这怎么回事啊?我应该怎么做才能减少连接数,提高数据库执行效率呢?
因为delphi里ADOQuery连接都是这样写的
先 close
然后 sql.clear sql.add
然后Open 估计连接数过多就是因为open以后没有close吧
但是刚才我open以后全部close了 ,sql连接进程还是那么多没变呀?请问高手这怎么回事啊?我应该怎么做才能减少连接数,提高数据库执行效率呢?
adoQuery的 connection 你是怎么写的?
Use Procedure for Prepare=1
//改下
Use Procedure for Prepare=0
我就是所有ADOQuery都连接一个adoconnection的啊,所以不能关单个呀
是我讲的不清楚么,我工程里就一个adoconnection啊,就是1个adoconnection对应N个adoquery 也就是一个sql连接对应N个sql线程。
我的目的是:close一个adoquery,让数据库的线程少掉一个以提高效率,并不是结束这个sql连接,也就是adoconnection。问题就是close adoquery没有用,线程仍然存在想请教高手该如何结束这个线程,而不影响连接其他adoconnection的adoquery。
应该够明白了吧。。
嗯 对呀,得到的是处理进程 但是我们公司用的软件很多啊,我的程序只要一打开就1000个进程,要知道sql服务器就一台啊,我想把没用的处理进程结束了,你知道怎么弄吗
[Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT
[DBID]
FROM
[Master].[dbo].[SYSDATABASES]
WHERE
NAME='数据库名'
)
blocked字段的值为0就表示没有阻塞,
waitresource字段的值为空就没问题,否则就是存在资源竞争,通过SPID查看执行的SQL语句,可能需要优化
最好是创建连接池,把各个客户端的SQL请求发送到应用层进行排队。
PS:一個adoconnect,然後其他的adoquery就直接和這個adoconnect連接...
我就是adoquery全部连在一个adoconection中的, adoconection就叫连接池吗?。我去百度一下。。囧rz
如果下次有相同的,则直接用这个实例。
而不是重新再创建一个。
(好像是这样一个意思)
应用上,如果是很频繁的调用同一句 sql , 那么 Prepare 绝对有帮助。
ADOConnection1:TADOConnection;
adoquery1,adoquery2:Tadoquery;
begin
try
try
adoconnection1:=Tadoconnection.Create(Self);
adoconnection1.LoginPrompt:=false;
adoconnection1.KeepConnection:=false;
ADOConnection1.ConnectionString:=connectStr;
adoconnection1.Open; ADOQuery1:=TADOquery.Create(self);
ADOQuery1.Connection:=Adoconnection1; ADOQuery2:=TADOquery.Create(self);
ADOQuery2.Connection:=Adoconnection1; adoconnection1.BeginTrans; //删除进货明细表
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('delete from jhmxb where id=:id');
adoquery1.Parameters.ParamByName('id').Value:=Trim(Edit22.Text);
adoquery1.Prepared;
adoquery1.ExecSQL; //修改进货汇总表
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('update jhhzb set jhje=jhje-:jhje,wfje=wfje-:wfje where djh=:djh');
adoquery1.Parameters.ParamByName('jhje').Value:=trim(edit18.Text);
adoquery1.Parameters.ParamByName('wfje').Value:=trim(edit18.Text);
adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;
//明细表是否删除完毕
adoquery2.Close;
adoquery2.sql.clear;
adoquery2.sql.add('select * from jhmxb where djh=:djh');
adoquery2.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery2.Prepared;
adoquery2.open;
if adoquery2.RecordCount=0 then
begin
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('delete from jhhzb where djh=:djh');
adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;
end; //库存明细表
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('update kcb set jhs=jhs-:jhs,kcs=kcs-:kcs where mc=:mc and jj=:jj');
adoquery1.Parameters.ParamByName('jhs').Value:=Trim(Edit21.Text);
adoquery1.Parameters.ParamByName('kcs').Value:=Trim(Edit21.Text);
adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);
adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
adoquery1.Prepared;
adoquery1.ExecSQL; adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('update kcb set jhje=jhs*jj,kcje=kcs*jj where mc=:mc and jj=:jj');
adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);
adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;
adoconnection1.CommitTrans;
except
adoconnection1.RollbackTrans;
application.MessageBox('当前信息资料保存失败请确定之后重新再试','提示',mb_ok+mb_iconstop);
end;
finally
jhmxb.ADOquery1.Close;
ADOQuery1.Close;
ADOQuery1.Free;
ADOQuery2.Close;
ADOQuery2.Free;
adoconnection1.Close;
adoconnection1.Free;
Self.Close;
end;
你的CLOSE只是关掉了数据集。
ADOQuery.active:=fault;