Winapi 如何使用可扩展存储引擎启动多个会话

Winapi 如何使用可扩展存储引擎启动多个会话,winapi,esent,Winapi,Esent,在的文档中,它注意到会话是定义事务的粒度单位,它定义游标在当前打开的表中的位置,它定义当前活动的索引。在一次会议上,其他任何事情都无法完成。但他们确实注意到: 为了增加对数据库的并发性和并行访问,可以启动多个会话 这就是我想要的。我想打开数据库的第二个会话 背景 ESE在如何运行方面有些复杂: JetCreateInstance(out instance, "UniqueInstanceName"); //Create a uniquely named instance of the ESE i

在的文档中,它注意到会话是定义事务的粒度单位,它定义游标在当前打开的表中的位置,它定义当前活动的索引。在一次会议上,其他任何事情都无法完成。但他们确实注意到:

为了增加对数据库的并发性和并行访问,可以启动多个会话

这就是我想要的。我想打开数据库的第二个会话

背景 ESE在如何运行方面有些复杂:

JetCreateInstance(out instance, "UniqueInstanceName"); //Create a uniquely named instance of the ESE in our process

JetInit(instance); //initialize the instance
   JetBeginSession(instance, out sessionID); //initialize a session on the instance
      JetAttachDatabase(sessionID, filename); //attach a database file to our session
         JetOpenDatabase(sessionID, filename, "", out databaseID, 0); //open the database file in our session

            //...now we can open table, get data, etc
            //E.g. JetOpenTable(sessionID, databaseID, "Customers", null, 0, JET_bitTableReadOnly, out tableID);

         JetCloseDatabase(sessionID, databaseID);
      JetDetachDatabase(sessionID, filename);
   JetEndSession(sessionID, 0);
JetTerm(instance);
这一切都有效

但我们如何开启另一个会议? ESE文档虽然不多,但确实暗示了在同一数据库中可以有多个会话:

  • 为了增加对数据库的并发性和并行访问,可以启动多个会话
  • JET\u bitTableDenyRead
    -无法通过另一个数据库会话打开该表进行读取访问。(这意味着有时它可以被另一个会话打开以进行读取访问)
  • JET\u bitTableDenyWrite
    -无法通过另一个数据库会话打开该表进行写访问。(这意味着有时它可以被另一个会话打开以进行写访问)
  • -对于同一个数据库,可以多次调用此函数
  • JET\u bitDbExclusive
    -只允许单个会话连接数据库通常,多个会话可以打开一个数据库。(重点)
天真的做法是开始另一次会议:

//Startup the instance
JetCreateInstance(out instance, "UniqueInstanceName");
JetInit(instance);

   //Make first session
   JetBeginSession(instance, out sessionID);
   JetAttachDatabase(sessionID, filename);
   JetOpenDatabase(sessionID, filename, "", out databaseID, 0);

      //Startup second session
      JetBeginSession(instance, out session2ID);
      JetAttachDatabase(session2ID, filename);
      JetOpenDatabase(session2ID, filename, "", out database2ID, 0);

      //Teardown second session
      JetCloseDatabase(session2ID, database2ID);
      JetDetachDatabase(session2ID, filename);  <----hangs
      JetEndSession(session2ID, 0);

   //Teardown first session
   JetCloseDatabase(sessionID, databaseID);
   JetDetachDatabase(sessionID, filename); 
   JetEndSession(sessionID, 0);

//Terminate instance
JetTerm(instance);
事实上,它似乎正好起作用

…是吗?

您在“连枷”中所做的是从多个会话访问数据库的正确方法

jetatachdatabase()
打开文件并将其与实例关联。它只需要调用一次

JetOpenDatabase()
在会话中打开数据库句柄,可以在每个会话中调用

//Startup the instance
JetCreateInstance(out instance, "UniqueInstanceName");
JetInit(instance);

   //Make first session
   JetBeginSession(instance, out sessionID);
   JetAttachDatabase(sessionID, filename);
   JetOpenDatabase(sessionID, filename, "", out databaseID, 0);

      //Startup second session
      JetBeginSession(instance, out session2ID);
      JetOpenDatabase(session2ID, filename, "", out database2ID, 0);

      //Teardown second session
      JetCloseDatabase(session2ID, database2ID);
      JetEndSession(session2ID, 0);

   //Teardown first session
   JetCloseDatabase(sessionID, databaseID);
   JetDetachDatabase(sessionID, filename); 
   JetEndSession(sessionID, 0);

//Terminate instance
JetTerm(instance);