创建oracle连接池,能不能把createpool和getConnection分开来写
发布于 9 年前 作者 canminco 6696 次浏览 最后一次编辑是 8 年前 来自 问答

node新手问题: 用的是oracle官方的包,oracledb.1.4.0,在创建连接池的时候,能把createPool和getConnection分开来写吗,先建立连接池,再创建连接,我如下改写了代码,却报错说getConnection不能识别,不明所以:

	var config = require("../config").initConfig();
	var oracledb = require("oracledb");
	var m_Pool = null;
	var numRows = 2;
	var initOracleConnectPool = function() {
	m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
		/*		pool.getConnection( function(err , connection) {
					if (err) { console.error(err.message); return; }
				    connection.execute(
				      "SELECT * " +
				        "FROM user_table " ,[],
				      function(err, result)
				      {
				        if (err) { console.error(err.message); return; }
				        else {
				          console.log(result.metaData);
				          console.log("begin");
				          fetchRowsFromRS(connection,result.resultSet,numRows);
				          //console.log(result.rows);
				        }
				      });
				});*/
	});
	}
	能不能改写为以下格式,方便先创建连接池,用的时候直接建连接就好:
 	//创建连接池
	var initOracleConnectPool = function() {
		m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
		console.log("the pool established ");
	}); 
	}
	
	//创建连接,执行查询
	exports.query = function() {
	if (!m_Pool) {
		initOracleConnectPool();
	}
	medusa_Pool.getConnection(function(err, connection) {
		if (err) {
			console.error(err.message);
			return;
		}
		connection.execute(
			"SELECT * " +
			"FROM user_table ", [], {
				resultSet: true,
				prefetchRows: 2
			},
			function(err, result) {
				if (err) {
					console.error(err.message);
					return;
				} else {
					console.log(result.metaData);
					console.log("begin");
					fetchRowsFromRS(connection, result.resultSet, numRows);
					//console.log(result.rows);
				}
			});
	});
	}
3 回复
	var globalPool;
	var initOracleConnectPool = function() {
		m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
			globalPool = pool;
			exports.query = globalPool.query;
		}); 
	}

exports 放外面应该也行,但要确保第一个瞬间没有调用。

@MiguelValentine 我测了下,是执行query的时候还没有返回pool的值,但是像这种调用,如何得到返回值了再调用,看了好多帖子,都没怎么明白,我这个感觉是反着调用异步函数的。想在query中调用initOracleConnectPool的返回值,这样才能做到先创建好连接池,然后在应用需要的时候建立连接。

@MiguelValentine 我在query函数里加了定时器,得到了正确的结果,如果不用定时器,如何实现这种异步函数调用,还是得再多看看异步调用的实例。

var query = function(sqlReq, callback) {
	if (!m_Pool) {
		console.log("3"+m_Pool);
		initOracleConnectPool();
	}

setTimeout (function() {
	console.log("4"+m_Pool);
	m_Pool.getConnection(function(err, connection) {
		if (err) {
			console.error(err.message);
			return;
		}
		connection.execute(
			"SELECT * " +
			"FROM user_table ", [], {
				resultSet: true,
				prefetchRows: 2
			},
			function(err, result) {
				if (err) {
					console.error(err.message);
					return;
				} else {
					console.log(result.metaData);
					console.log("begin");
					fetchRowsFromRS(connection, result.resultSet, numRows);
					//console.log(result.rows);
				}
			});
	});
},10);
}
回到顶部