加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

db-oracle不会革新数据

发布时间:2021-03-05 22:00:04 所属栏目:站长百科 来源:网络整理
导读:我正在行使Node.js开拓一个简朴的处事.它吸取上载的文件,将它们存储在磁盘上并在Oracle表上记录一些元数据.我正在行使db-oracle包和毗连池,遵循以下文章: http://nodejsdb.org/2011/05/connection-pooling-node-db-with-generic-pool/ 可是,我留意到,我插入

我正在行使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);
    });
  });
});

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读