我用BDE连接Sybase数据库.系统有用来连接数据库的所有控件都在一个数据库模块中,也就有就二个控件,分别是TDatabase,TQuery控件.系统中多是调用Sybase中的存储过程来查询数据.我专用一个函数做查询操作.此函数如下:
procedure OperateDB(Qy:TQuery;StrSql:string);
begin
  if  Qy.active then Qy.close;
  Qy.SQl.clear;
  Qy.Sql.Add(StrSql);
  try
    Qy.open;
  except
   Qy.close;   
  end;
end;因为系统是多线程的,而我的数据库查询是单线程.
当只有二个人同是做查询时,一彻都很正常,当同时有三个人做查询时,系统慢得有点缓慢.当有4个人同时做查询时,系统变得非常慢而且没有查不到数据.
我相那是数据库的并发问题,请问如何解决??

解决方案 »

  1.   

    你的程序逻辑描述的不清。
    首先感觉你说得像3层,不然怎么会有多人共享一个TDatabase,又感觉像2层,因为你说多线程。麻烦先费点力把问题说清楚,自己想问什么要说明白才行。
      

  2.   

    每次都重新连接和关闭当然慢了,对经常查询的表,起常连接,查询时只改变参数refresh即可;
    另外,很大的可能是你的索引建的不好,如果你的查询条件字段不是索引的话,建议修改
    索引;
    才两三个用户,不应该是并发问题。
      

  3.   

    情况是这样的,整个系统是由三个企业开发,数据库是用Sybase,是另一个企业提供,就是提借存储过程给我们,我公司是做一个DLL,负责与数据库打交道,还有一家公司是做业务逻辑,他访问数据库就是调用我公司的DLL接口.他是多线程的.
      

  4.   

    保证每个的连接的Session是单独的。TDatabase 可以共享,但是TSession必须每次都提供唯一的,让多个客户调用的彼此的会话分开。TSession的总数不能超过48个,这是BDE的限制。
      

  5.   

    但是我怎么样保证TSession每次都提供唯一呢我只有一个TDatabase,也只有一个TQuery.
    再是,现在最多用户中30,将来要增加到60个,但TSession的总数又不能超过48个,那怎么设置?
      

  6.   

    做成DataSnap或者WebSnap 多好!你现在工作实际上还是模拟DataSnap。我没仔细研究过DLL作数据库这东西,以下只是我的推断,仅供参考。你的DLL不需要做成多线程,因为你得dll中的函数会变成客户程序的一部分,它可以在线程里面调用你。
    我不知道你的DLL中怎么初始化连接这个TDatabase,这个可能是个问题。如果可能,最好把它改成DataSnap,他的模型要好得多。