论坛首页 Java企业应用论坛

数据库的同步和异步执行模式

浏览 5199 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-06-29  

同步和异步执行模式 
  ODBC2.0访问数据库时,有同步执行模式与异步执行模式之分。 
  所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至程序结束。例如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将一直等待服务器将查询结果返回客户机端后,才继续进行下一步操作。

 所谓异步执行模式,是指语句在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同。例如查询操作,客户机上的应用程序在向服务器发出了查询操作的指令后,将立刻执行查询语句的下一条语句,而不需要等到服务器将查询结果返回客户机端后,才继续进行下一步操作。 

  在一些应用程序开发工具中,在其提供使用数据控制项和数据库对象变量进行编程的同时,并没有很好地考虑到同步执行模式与异步执行模式的重要区别。为了使程序运行速度更快,其语句执行的缺省模式为异步模式。对于一般程序员来说,如果他对同步执行模式与异步执行模式不了解的话,他往往会在对服务器发出一个操作语句(查询或读取一条记录等操作)后,立刻引用服务器返回的执行结果,或者对该结果进行下一步操作;在异步执行模式下,客户机上的后续语句是在该操作语句发出后接着执行的,但由于各种原因,服务器不一定能执行完该操作语句,并在后续语句执行前将结果返回客户机。因此,后续语句在引用前一操作语句的执行结果时,往往会因为该执行结果并不存在而引用了错误的值,造成系统错误或死锁。

  解决上面所提到的问题,可以采取以下两种方案: 

  ①利用ODBC2.0API,将语句执行状态设置为同步执行模式。ODBC2.0API中,函数SQLSetStmtOption()的功能是设置同步或异步执行模式。我们可以采用以下语句,将语句执行状态设置为同步执行模式: 
iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENABLE,0) 
其中,hStmt是一有效的语句句柄,常数SQL-ASYNC-ENABLE是所要设置的选项,参数0表示该选项(即异步执行模式)关闭。如果iRetCode返回SQL-SUCCESS,则表示语句执行状态已被设置为同步执行模式。 
  ②利用ODBC2.0API,将语句执行状态设置为异步执行模式,然后在程序中不断查询一个操作语句是否已经执行完毕。 
  这些函数第一次调用后,将返回值SQL-STILL-EXECUTING,这时应用程序将继续执行后续语句。过了一段时间后,应该再次调用原函数,而且要注意:实参数应传入与第一次调用时相同的语句句柄,其他参数也应一样(但会被忽略)。如果函数返回值为SQL-SUCCESS,则表明该语句已经执行完毕;如果函数返回SQL-STILL-EXECUTING,则表明该语句仍在执行中。 

  我们可以用一个简单的例子说明如下: 

iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENABLE,1) 
′置语句执行模式为异步执行模式 
iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23) 
......′执行其他操作 
iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23) 
′判断SQLExecDirect()是否已执行完毕 
If(iRetCodeΚSQL-STILL-EXECUTING)Then 
......′该语句未执行完,继续执行其他操作 
Else 
If(iRetCodeΚSQL-SUCCESS)Then 
......′该语句已执行完,可对语句操作结果进行处理 
EndIf 
EndIf

  同步执行模式可以简化程序编制的复杂性,对ODBC2.0API不十分熟悉的程序员,可以不用过多地了解比较复杂的ODBC2.0API,而只需使用数据控制项和数据库对象变量来编写应用程序,使开发效率大大提高,但程序运行速度比不上异步执行模式的速度。 

  异步执行模式虽然在编程序时十分复杂,但在这种模式下可以进行多任务并行执行,使执行效率大大提高。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics