Сегментация при использовании node-oracle в Ubuntu - PullRequest
0 голосов
/ 12 марта 2012

Я использую модуль node-oracle со следующим кодом (из документации по node-oracle):

var oracle = require("oracle");

oracle.connect({ "hostname": "192.168.1.120/orcl", "user": "USER", "password": "PASS" }, function(err, connection) {
  if(err){ console.log("Connect err:" + err); }
  if(connection){ console.log("Connection:" + connection); }

  // selecting rows
connection.execute("SELECT nickname FROM users WHERE nickname = :1", ['luc'], function(err, results) {
  console.log("execution");
  console.log("RESULTS:" + results);
  console.log("Err:" + err);
});

connection.setAutoCommit(true);

connection.commit(function(err) {
  console.log("commiting");
  // transaction committed
});

connection.rollback(function(err) {
  console.log("rollback");
  // transaction rolledback
});

connection.close(); // call this when you are done with the connection
});

Это дает мне разные сообщения об ошибках:

$ node test_node_oracle.js 
Connection:[object Connection]
rollback
commiting
execution
RESULTS:undefined
Err:Error: ORA-24324: service handle not initialized

Иногда это также дает:

$ node test_node_oracle.js 
Connection:[object Connection]
Segmentation fault

или также:

$ node test_node_oracle.js 
Connection:[object Connection]
commiting
rollback
execution
RESULTS:undefined
Err:Error: ORA-32102: invalid OCI handle

sqlplus доступ работает нормально, хотя:

$ sqlplus USER/PASS@192.168.1.120/orcl

SQL * Plus: выпуск 11.2.0.3.0, производство в понедельник, 12 марта 15:18:18 2012

Copyright (c) 1982, 2011, Oracle. Все права защищены.

Подключено к: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.1.0 - Производство С опциями Partitioning, OLAP, Data Mining и Real Application Testing

SQL>

1 Ответ

2 голосов
/ 12 марта 2012
connection.close(); // call this when you are done with the connection

Я считаю, что этот вызов вызывается слишком рано, потому что все операторы неблокируют в node.js (цикл обработки событий) .Вы, вероятно, должны обернуть его в надлежащие обратные вызовы внутри commit и rollback.Вы также должны обернуть весь свой код в connection callback

oracle.connect({ "hostname": "192.168.1.120/orcl", "user": "USER", "password": "PASS" }, function(err, connection) {
// wrap all your code inside of this.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...