db-oracle不会刷新数据
我正在使用Node.js开发一个简单的服务.它接收上载的文件,将它们存储在磁盘上并在Oracle表上记录一些元数据.我正在使用db-oracle包和连接池,遵循以下文章: http://nodejsdb.org/2011/05/connection-pooling-node-db-with-generic-pool/ 但是,我注意到,我插入的数据仅在连接池关闭空闲连接后通过调用其disconnect()方法发送到Oracle数据库. 有没有办法在向客户端发送“OK”信号之前刷新数据?它现在的工作方式,我的Web服务或Oracle本身的崩溃都可能导致数据丢失,而我的服务客户端也不会知道它.我实际上是在上传一段时间后通过杀死我的应用程序进行测试,数据确实丢失了. 这是代码的简化版本: var express = require('express'); var app = module.exports = express.createServer(); app.post('/upload',handleUpload); app.listen(4001,function(){ console.log("Express server listening on port %d in %s mode",app.address().port,app.settings.env); }); function handleUpload(req,res) { res.contentType('application/xml'); var buf = ''; req.on('data',function(chunk) { buf += chunk; }); req.on('end',function() { saveUpload(req,res,buf); }); } function saveUpload(req,buf) { if (buf.length == 0) return sendError(res,'No data supplied',422); var payload = new Buffer(buf,'base64'); files.save(payload,function(err,savedFile) { if (err) return sendError(res,'Error while saving',500); var obj = { ip: req.connection.remoteAddress,location: savedFile.path,created_at: new Date(),updated_at: new Date() }; var fields = ['IP','LOCATION','CREATED_AT','UPDATED_AT']; var values = fields.map(function(v) { return obj[v.toLowerCase()] }); pool.acquire(function(err,conn) { if (err) return sendError(res,err,500); var q = conn.query().insert('FILES',fields,values); q.execute(function(err,result) { pool.release(conn); if (err) return sendError(res,500); if (result.affected < 1) return sendError(res,'Error saving the record',500); // The next statement sends the final result to the client. // However,the new record was not yet flushed to the database. res.end('<ok />'); }); }); }); } function sendError(res,code) { console.log(err); res.send('<error>' + err + '</error>',code || 500); } 作为一种解决方法,我试图实现一个虚假的连接池并释放所有获得的连接,但现在我的应用程序正在消息:纯虚拟方法称为Abort trap:6 这是假连接池: var fakePool = { acquire: function(callback) { new oracle.Database(config.database).connect(function(err,server) { callback(err,this); }); },release: function(conn) { conn.disconnect(); } }; 为了清楚起见,我不关心假连接的问题,这只是一个肮脏的解决方法.我希望能够在向客户端发送“确定”之前将数据刷新到Oracle. 顺便说一句,我还在他们的Github上开了一张票:https://github.com/mariano/node-db-oracle/issues/38 解决方法你显然错过了一个事务提交.node-db不需要公开提交API,因为在大多数RDBMS(包括Oracle)中,COMMIT是一个有效的查询.由于包允许执行任意查询,因此应该使用简单的execute()来完成提交/回滚 代码应更改如下: pool.acquire(function(err,conn) { if (err) return sendError(res,500); var q = conn.query().insert('FILES',values); q.execute(function(err,result) { if (err || result.affected < 1 ) { pool.release(conn); return sendError(res,500); } conn.query().execute("commit",result) { if (err) { pool.release(conn); return sendError(res,500); } res.end('<ok />'); pool.release(conn); }); }); }); (编辑:上饶站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |