Ver código fonte

oracle连接池问题,新增oracle连接工具类

huangwenjie 5 anos atrás
pai
commit
0372ad95af

+ 9 - 9
src/server/repository/oracle/db/im.db.js

@ -3,19 +3,19 @@
 * huangwenjie
 */
"use strict";
var configFile = require('../../../include/commons').CONFIG_FILE;
var config =  require('../../../resources/config/' + configFile);
let configFile = require('../../../include/commons').CONFIG_FILE;
let config =  require('../../../resources/config/' + configFile);
var oracledb = require('oracledb')
var dbUtil = require('../../../util/db.util');
// let oracledb = require('oracledb')
let dbUtil = require('../../../util/db.util');
oracledb.poolMax = 100;
oracledb.poolMin = 1;
oracledb.poolPingInterval = 20;
oracledb.poolTimeout = 0;
// oracledb.poolMax = 100;
// oracledb.poolMin = 1;
// oracledb.poolPingInterval = 20;
// oracledb.poolTimeout = 0;
// 初始化连接池
var pool = oracledb.createPool(config.imDbConfig);
// let pool = oracledb.createPool(config.imDbConfig);
class ImDb {
    constructor() {

+ 1 - 1
src/server/repository/oracle/db/server2.js

@ -59,7 +59,7 @@ var initPool = async function () {
        } catch (err) {
            pool["im"] = false;
            console.error(err.message);
            throw new Error('连接池"im"创建失败!");
            throw new Error('连接池"im"创建失败');
        }
    // }
}

+ 30 - 12
src/server/repository/oracle/session.repo.js

@ -6,6 +6,9 @@
let ImDb = require('../oracle/db/im.db');
let log = require('../../util/log.js');
//oracle工具类
let oracledbUtil = require('../../util/oracledb.util');
const DB_TABLES = require('../../include/commons').DB_TABLES;
const PARTICIPANT_ROLES = require('../../include/commons').PARTICIPANT_ROLES;
const SESSION_STATUS = require('../../include/commons').SESSION_STATUS;
@ -38,17 +41,26 @@ class SessionRepo {
     * @param handler
     */
    static findAll(userId, handler) {
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = '"+userId+"' AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sys_session = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = 'SYSTEM' AND PARTICIPANT_ROLE =0  GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE,BUSINESS_TYPE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME,STATUS FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sql + ") AND S.ID NOT IN ("+sys_session+")";
        ImDb.execQuery({
            "sql": sessionSQL,
        oracledbUtil.query({
            "sql": sql,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
        //
        // ImDb.execQuery({
        //     "sql": sessionSQL,
        //     "args": [userId],
        //     "handler": handler || function (err, res) {
        //         if(err) log.error(err);
        //     }
        // });
    }
    /**
@ -150,24 +162,30 @@ class SessionRepo {
            }
        }
        let sqlTemp = "SELECT rownum r,SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN('"+userId+"') GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT ID, NAME, TYPE, CREATE_DATE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME FROM "
        let sqlTemp = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID IN('"+userId+"') GROUP BY W.SESSION_ID";
        let sessionSQL = "SELECT rownum r, ID, NAME, TYPE, CREATE_DATE, LAST_SENDER_ID, LAST_SENDER_NAME, LAST_CONTENT_TYPE, LAST_CONTENT, LAST_MESSAGE_TIME FROM "
            + DB_TABLES.Sessions + " S WHERE S.ID IN(" + sqlTemp + ") AND S.TYPE IN("+type+") ";
        if(status != null && status != ""){
            sessionSQL += " AND S.STATUS="+status
        }
        sessionSQL +=  " ORDER BY S.LAST_MESSAGE_TIME DESC "
        let sql = "SELECT * FROM ( "+sessionSQL+" AND rownum<="+pagesize+" ) WHERE r>="+page
        let sql = "SELECT * FROM ( "+sessionSQL+" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page
        log.info(sessionSQL)
        ImDb.execQuery({
        oracledbUtil.query({
            "sql": sql,
            "args": [userId],
            "handler": handler || function (err, res) {
                if(err) log.error(err);
            }
        });
        // ImDb.execQuery({
        //     "sql": sql,
        //     "args": [userId],
        //     "handler": handler || function (err, res) {
        //         if(err) log.error(err);
        //     }
        // });
    }
    static findAllByTypeAndStatus(userId, businessType,status,page,pagesize, handler) {
@ -183,13 +201,13 @@ class SessionRepo {
        if(status == SESSION_STATUS.ENDED){
            if(businessType == SESSION_BUSINESS_TYPE.PATIENT){//区分居民,有未读消息的置顶排列
                //找出已经结束的咨询
                sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = '"+userId+"'  GROUP BY W.SESSION_ID";
                sql = "SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ?  GROUP BY W.SESSION_ID";
                //找出角色讨论组中为旁听且未结束的咨询
                let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = '"+userId+"' AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
                let sql1 = ("SELECT SESSION_ID FROM " + DB_TABLES.Participants + " W WHERE W.PARTICIPANT_ID = ? AND PARTICIPANT_ROLE ="+PARTICIPANT_ROLES.REGULAR+" GROUP BY W.SESSION_ID")
                sessionSQL =  "SELECT rownum r, S.* FROM " + DB_TABLES.Sessions + " s, " + DB_TABLES.Participants + " P " +
                    " WHERE ((S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = "+businessType+" AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = "+businessType+" AND S.STATUS = 0)) " +
                    " WHERE ((S.ID IN(" + sql + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 1) OR (S.ID IN(" + sql1 + ") AND S.BUSINESS_TYPE = ? AND S.STATUS = 0)) " +
                    // " and s.id = p.session_id and p.participant_id = ? ORDER BY (p.last_fetch_time - s.last_message_time+1)>0,s.create_date desc limit "+page+","+pagesize;
                    " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = '"+userId+"' ";
                    " AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = ? ";
                sessionSQL = "SELECT*FROM ( " + sessionSQL +" AND rownum<="+pagesize+" ORDER BY S.LAST_MESSAGE_TIME DESC ) WHERE r>="+page;
                ImDb.execQuery({

+ 12 - 6
src/server/util/db.util.js

@ -8,7 +8,7 @@ let config = require('../resources/config/' + configFile);
let log = require('./log');
let crypto = require('crypto');
var oracledb = require("oracledb");
let oracledb = require("oracledb");
class DbUtil {
    constructor() {
@ -17,7 +17,9 @@ class DbUtil {
    static execQuery(poolName, options) {
        if (config.showSQL) log.info(options.sql);
        var pool_name = oracledb.getPool(poolName);
        let pool = oracledb.createPool(config.imDbConfig);
        let pool_name = oracledb.getPool(poolName);
        // try {
        //     var connection = pool_name.getConnection();
@ -39,7 +41,7 @@ class DbUtil {
            // 执行查询
            if (args) {
                connection.execute(sql,function (err, results) {
                connection.execute(sql,args,function (err, results) {
                    if (err) {
                        log.error(err.message)
                        log.error("Execute SQL failed, arguments: " + args + ", sql: " + sql);
@ -52,6 +54,7 @@ class DbUtil {
            } else {
                connection.execute(sql, function (err, results) {
                    if (err) {
                        log.error(err.message)
                        log.error("Execute SQL failed: " + sql);
                        return handler(err, results);
@ -62,10 +65,13 @@ class DbUtil {
            }
            // 返回连接池
            connection.release(function (err) {
                if (err) {
                    log.error('Database - release connection failed, ' + err);
            connection.close(function(err){
                if(err)
                {
                    console.error("close db connection failed:" + err.message);
                }
                return;
            });
        });
    }

+ 66 - 0
src/server/util/oracledb.util.js

@ -0,0 +1,66 @@
let configFile = require('../include/commons').CONFIG_FILE;
let config = require('../resources/config/' + configFile);
let oracledb = require('oracledb');
let log = require('../util/log.js');
let query = function(options,callback){
    oracledb.getConnection(
        {
            user: config.imDbConfig.user,
            password: config.imDbConfig.password,  // mypw contains the hr schema password
            connectString: config.imDbConfig.connectString
            // poolAlias: "im"
        },
        function (err, connection)
        {
            let sql = options['sql'];
            let args = options['args'];
            let handler = options['handler'];
            log.info(options.sql)
            log.info(options.args)
            if (err)
            {
                console.error(err.message);
                return handler(err, null);
            }/*else{
                console.log("连接成功");
            }*/
            connection.execute(sql, [], function (err, result)
            {
                if (err) {
                    log.error(err.message)
                    log.error("Execute SQL failed: sql" + sql);
                    log.error("Execute SQL failed: args" + args);
                    doRelease(connection);
                    return handler(err, result);
                }
                handler(null, result);
                //
                // //console.log(result.metaData);
                // callback(result.rows.map((v)=>
                // {
                //     return result.metaData.reduce((p, key, i)=>
                //     {
                //         p[key.name] = v[i];
                //         return p;
                //     }, {})
                // }));
                doRelease(connection);
            });
        }
    );
}
function doRelease(connection) {
    connection.close(
        function(err) {
            if (err)
                console.error(err.message);
        });
}
exports.query = query;