畅享博客 > 航行日志——理论与实践并行 > 程序人生 > [分享]关于TSession的问题
2007-6-26 9:14:03

[分享]关于TSession的问题

数据库访问时,
1.Session有什么作用?
2.什么是Session?
3.多线程访问db时需要给每个线程建立一个Session吗?
4.如果多个线程使用一个Session会有什么后果?

---------------------------------------------------------------

Session是BDE 宝蓝数据引擎 的数据库管理组件,并不象名字提示。更准确
  的名字应该叫DatabaseManager

  可以这样使用它
  int i;
  AnsiString S;
  TStringList *DBNamesList = new TStringList;
  TTreeNode *Node;

  ImageList1->ResourceLoad(rtBitmap, "FolderShut", clPurple);

  Session->GetDatabaseNames(DBNamesList);
  for (i = 0; i < DBNamesList->Count; i++)
  {
    S = DBNamesList->Strings[i];
    Node = TView->Items->Add(TView->Selected, S);
    TView->Items->AddChild(Node, "TEMP");
  }

 
void TForm1::AddTables(TTreeNode *Node)
{
  int j;
  AnsiString S(Node->Text);
  TTreeNode *TempNode, *ChildNode;
  TStringList *List = new TStringList;

  DeleteTemp(Node);

  Session->GetTableNames(S, "*.*", True, False, List);
  for (j = 0; j < List->Count; j++)
  {
    TempNode = TView->Items->AddChild(Node, List->Strings[j]);
    ChildNode = TView->Items->AddChild(TempNode, "Fields");
    TView->Items->AddChild(ChildNode, "TEMP");
    ChildNode = TView->Items->AddChild(TempNode, "IndexNames");
    TView->Items->AddChild(ChildNode, "TEMP");
  }
  List->Free();
}
  DBNamesList->Free();


---------------------------------------------------------------

2.什么是Session?
--->一个数据库连接。

1.Session有什么作用?
多用户连接数据库时,可以为他们分配不同的连接,提高效率

3.多线程访问db时需要给每个线程建立一个Session吗?
不一定,Session是可以共享的!

4.如果多个线程使用一个Session会有什么后果?
如果某线程进行复杂的数据库操作,就会影响了其它的操作。
另外,Session也是耗费资源的,因此不要多开。


---------------------------------------------------------------

TSession元件用来管理BDE会话期,一般来说,并不需要专门把它放到FORM或数据模块上,因为数据库应用程序每启动时会自动创建一个默认的BDE会话期对象叫Session.但如果应用程序需要同时访问会于不同网络位置的Paradox表,就需要为每个网络位置建立一个BDE会话期对象,这时候,就要在设计时期把几个TSESSION放到FORM或数据模块上.如果开发的是一个多线程程序,也要明确地用到它,因为几个线程可能要同时连接数据库.
BCB用TSESSIONLIST管理和操纵一个应用程序中所有的BDE会话期对象,并且已经声明了TSESSIONlIST对象的实例,叫SESSIONS.
---------------------------------------------------------------

不管是独立的应用程序,还是完整的客户端数据库应用程序和数据库应用程序服务器都能够通过
B o r l a n d数据库引擎( B D E)和数据库进行通信。一个应用程序的数据库连接、驱动程序、指针
(c u r s o r s)、查询等数据库对象都在一个或者多个BDE session期间加以维护。s e s s i o n隔离了一组数据库存
取操作,如数据库连接,从而不需要再启动另一个应用程序。
在一个应用程序中,可以使用T S e s s i o n和T S e s s i o n L i s t组件来管理BDE session。应用程序中的每一
个T S e s s i o n组件封装了一个单一的BDE session。应用程序中所有的s e s s i o n由一个T S e s s i o n L i s t组件来管
理。
所有数据库应用程序都自动地包括一个session 组件,称为S e s s i o n,它包含了缺省的BDE session 。
应用程序可在需要时声明、创建和操作另外的s e s s i o n组件。
所有的数据库应用程序也自动地包括一个session list组件,称为S e s s i o n s,它允许应用程序管理其中
所有的session 组件。
本章描述session 和session list组件,并解释了在完整的客户端数据库应用程序和数据库应用程序服
务器中如何使用它们来控制BDE session 。
注意缺省的session 和session list组件提供了大部分应用程序能够使用的缺省的属性值。只有使
用多个s e s s i o n的应用程序(如需要对同一个数据库进行并行查询)才需要对其session 和s e s s i o n
list组件进行操作。
17.1 使用一个session组件
在应用程序中的s e s s i o n组件为一组数据库连接提供了全局管理功能。当创建一个完整的客户端数据
库应用程序或者数据库应用程序服务器,应用程序自动包含一个称为S e s s i o n的session 组件当在应用程
序中加入数据库和数据集组件时,它们自动地与缺省的session 相关联。它也可以控制受口令保护的
P a r a d o x文件的存取,并指定一个目录定位用于在网络上共享的P a r a d o x文件。应用程序通过使用s e s s i o n
组件的属性、事件和方法来控制数据库连接和对P a r a d o x文件的存取。
可以使用缺省的s e s s i o n组件来控制应用程序的所有的数据库连接。此外,还可以在设计时加入额外
的s e s s i o n组件或者在运行时动态地创建它们来控制应用程序中的数据库连接子集。
一些应用程序要求额外的s e s s i o n组件,如需要对同一个数据库进行并行查询的应用程序。在这种情
况下,每一个并行的查询必须在它自己的session 期间运行。多线程的数据库应用程序也需要多个s e s s i o n。
使用多个s e s s i o n组件的应用程序必须通过名为S e s s i o n的session list组件来管理这些s e s s i o n。有关管理多
个s e s s i o n的更多信息,可参阅1 7 . 2节。
17.1.1 使用缺省session
所有的数据库应用程序都自动地包括一个缺省的s e s s i o n。C + + B u i l d e r在每次运行一个数据库应用程
序时,创建一个称为S e s s i o n的缺省s e s s i o n组件(注意它的S e s s i o n N a m e属性值为“ D e f a u l t”)。这个缺省
的session 组件会对没有与另一个s e s s i o n组件关联的所有数据库组件进行全局管理,不管它们是否是临时
的(在运行时当打开一个与已创建的数据库组件没有关联的数据集时由s e s s i o n创建)或永久的(由应用
程序显式地创建)。缺省的s e s s i o n在设计时,在数据模块或者窗体中是不可见的。但在运行时可以在程
序代码中访问其属性和方法。
当创建了一个数据库组件,它会自动地与缺省session 关联。当一个组件对已经由缺省s e s s i o n打开
的数据库进行并行的查询操作时,只需要将这个数据库组件与一个明确命名的s e s s i o n关联。当创建一个
多线程数据库应用程序,必须创建额外的s e s s i o n处理额外的线程。
要使用缺省的session ,除非应用程序需要进行

推荐到鲜果: 查阅更多相关主题的帖子: TSession

评论

您正在以 匿名用户 的身份发表评论  快速登录
(不得超过 50 个汉字)
       看不清,换一个
提示消息
(输入完内容可以直接按Ctrl+Enter提交)