玖叶教程网

前端编程开发入门

SQL队列的使用

我们开发的业务应用基本上都会涉及到数据库操作,且一般对数据操作的一致性都有要求,为此,任擎服务器提供了数据库事务服务,如果在一个后端服务中有多个数据库增删改操作,只要有一个出现错误,其他操作都会自动回滚,这样就可以保证数据的一致性。

但是对于一些需要频繁执行、先后又没有什么关联的、独立的数据库增删改操作,例如添加日志信息、清除日志信息等,如果使用数据库事务会给服务器造成很大压力,浪费资源,为此,任擎服务器提供了SQL队列功能,开发人员可以把没有什么关联性、不需要返回执行结果的、独立的SQL语句推送到队列内,任擎服务器会按照先后顺序执行,如果执行某条语句出现错误,会记录错误信息并移除该语句,然后继续执行后续的语句,不会停止,也不会回滚已经执行的语句,这样客户端也不需要非得等数据库操作执行完才能干别的事,后端服务只要把要执行的SQL语句添加到队列里,就可以马上向客户端返回响应,客户端可以继续进行其他操作。

在全局对象server内有一个名为sqlHandler的属性,使用该属性的add(reqId, sql, params, isLog)方法既可添加要存入SQL队列的SQL语句信息,该方法的参数说明如下:

reqId:请求id,对应传入任讯后端服务的process(req, res)方法的req对象的_requestId,用来标示具体是哪个请求执行的SQL,可以为空。

sql:需要执行的SQL语句,不能为空。

params:需要替代SQL语句中的?号的参数数组,可以为空。

isLog:是否是保存日志信息时产生的SQL语句,如果是,则不再将该操作作为日志保存到数据库,要不就死循环了,该参数可以为空,默认为false。

示例代码如下:

//清除数据库中的日志记录

console.log('正在清除过期的日志记录...');

server.sqlHandler.add(0, 'delete from sys_log_static where id in '

+'(select id from sys_log_request where TimeStampDiff(DAY,req_time,now())>'

+this.saveToDB.saveDays+') ', null, false);

server.sqlHandler.add(0, 'delete from sys_log_service where id in '

+'(select id from sys_log_request where TimeStampDiff(DAY,req_time,now())>'

+this.saveToDB.saveDays+') ', null, false);

server.sqlHandler.add(0, 'delete from sys_log_upload where id in '

+'(select id from sys_log_request where TimeStampDiff(DAY,req_time,now())>'

+this.saveToDB.saveDays+') ', null, false);

server.sqlHandler.add(0, 'delete from sys_log_download where id in '

+'(select id from sys_log_request where TimeStampDiff(DAY,req_time,now())>'

+this.saveToDB.saveDays+') ', null, false);

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言