我们开发的业务应用基本上都会涉及到数据库操作,且一般对数据操作的一致性都有要求,为此,任擎服务器提供了数据库事务服务,如果在一个后端服务中有多个数据库增删改操作,只要有一个出现错误,其他操作都会自动回滚,这样就可以保证数据的一致性。 但是对于一些需要频繁执行、先后又没有什么关联的、独立的数据库增删改操作,例如添加日志信息、清除日志信息等,如果使用数据库事务会给服务器造成很大压力,浪费资源,为此,任擎服务器提供了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);