我要改别人的程序,其中大量使用线程,在线程中查询数据库十分频繁,又没有用Session
来控制,全部是共用一个TDatabase.
那么,我是否要对每一个线程(会同时运行多个线程,线程是动态创建的)来使用一个DataBase?而且我在线程中创建的Database,一给他的SessName赋值线程就退出。
我第一次用Session,请大家指教,分不够我再加。
procedure test.Execute;
var
  sql:string;
begin
  qryGetZlgs := TQuery.Create(nil);
  qryGetTj := TQuery.Create(nil);
  Database1:= TDatabase.Create(nil);
  Database1.DatabaseName:='222';
  sessGetZlgs := TSession.Create(nil);
  sessGetZlgs.SessionName:='11';
  sessGetZlgs.Active:=true;
  Database1:= form1.dbInteract;//dbInteract可以连数据库
  database1.SessionName:=sessGetZlgs.SessionName;//这里就会退出
  qryGetZlgs.DatabaseName:='222';
  qryGetZlgs.SessionName:=sessGetZlgs.SessionName;
  qryGetTj.SessionName:=sessGetZlgs.SessionName;
  sql:= 'select Count(*) from a';
  qryGetZlgs.Close;
  qryGetZlgs.SQL.Clear;
  qryGetZlgs.SQL.Add(sql);
  qryGetZlgs.open;             //这样写可以吗?
  showmessage('ew');  sql:= 'select Count(*) from b';
  qryGetTj.Close;
  qryGetTj.SQL.Clear;
  qryGetTj.SQL.Add(sql);
  qryGetTj.open;             
end;

解决方案 »

  1.   

    session直接在设计期指定name,不用动态在代码中指定,有session的话只用一个database就可以了
      

  2.   

    公用一个Database 可以,但是每个线程需要有自己的TSession 才行。
    BDE的help里面有个简单的例子。
      

  3.   


    TSession.AutoSessionName:=True;
      

  4.   

    谢谢大家!
    我是不是可以这样理解:
    只用一个公用的Database,在线程中动态的创建Session,并动态的变换Database的SessionName,那AutoSessionName:=True我又怎么指定?
      

  5.   

    pazee(耙子) 兄:找到例子了吗? 先谢谢了。
      

  6.   

    TSession.AutoSessionName:=True会自动产生多个Session来对应她的线程
      

  7.   

    TSession.AutoSessionName:=True,只有一个Database就可以了。
      

  8.   

    不用你那样,你只要指定每个table或者query的sessionname,根本不用在代码中做什么特别的处理
      

  9.   

    可是不论用哪种方法,到Query.open的时候,线程就退出了呀?能给个例子看看吗?