首页 > 数据库 >java操作Oracle 方式三 ( 全局一个连接,当操作时发现连接断开了,则再次连接,单线程 )

java操作Oracle 方式三 ( 全局一个连接,当操作时发现连接断开了,则再次连接,单线程 )

时间:2024-07-15 13:18:22浏览次数:14  
标签:ps jsonObj java String 单线程 toString sql logger 连接

全局一个连接,当操作时发现连接断开了,则再次连接,单线程

这种方式好处是,全局一个连接,不会每次都发启连接,适用于某一时刻,频繁操作数据库,如:每晚同步数据

OracleUtil.java 基础类代码 详见:https://www.cnblogs.com/hailexuexi/p/18302732

完整代码

dbCdrOneConnect.java

package com.JavaRabbitMQToDataBase.dbOracle;

import java.util.UUID;
import com.alibaba.fastjson.JSONObject;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class dbCdrOneConnect  {
    protected static final Logger logger = LoggerFactory.getLogger(dbCDR.class);
    //连接对象
    Connection connection=null;
    //创建预编译对象
    PreparedStatement ps=null;
    //创建结果集
    ResultSet rs = null;
    //CDR 参数
    private String _eventJson;

    public dbCdrOneConnect(){
        if (OracleUtil.oracle_open.equals("true") == false) {
            logger.warn("dbCDR insert() CDR 没有启动连接数据库 " + OracleUtil.oracle_open + " " + _eventJson);
            return;
        }
        connection = OracleUtil.getCon();//连接对象
    }
//插入
    public int insert(String eventJson) {
        _eventJson=eventJson;

        logger.debug("dbCDR insert() CDR 准备执行SQL" + this._eventJson);
        int result = 0;
        String sql = "";
        String callid ="";
        String callfrom ="";

        try {
            //{"event":"NewCdr","callid":"1627349862.433","timestart":"2021-07-27 09:37:42","callfrom":"1008","callto":"1009"
            // ,"callduraction":"16","talkduraction":"11","srctrunkname":"","dsttrcunkname":"","pincode":"","status":"ANSWERED"
            // ,"type":"Internal","callPath":"","recording":"20210727093747-1627349862.433-1008-1009-Internal.wav","didnumber":"","agentringtime":"0"
            // ,"sn":"369264842620"}
            String strId = UUID.randomUUID().toString();//唯一码
            JSONObject jsonObj = JSONObject.parseObject(this._eventJson);//

            String event = jsonObj.get("event").toString();
            callid = jsonObj.get("callid").toString();
            String timestart = jsonObj.get("timestart").toString();
            //主叫号码
            callfrom = jsonObj.get("callfrom").toString();
            //被叫号码
            String callto = jsonObj.get("callto").toString();
            //如果有 6703(1008) 时将队列号6703 去掉
            if(callto.contains("(")==true){
                callto = callto.substring(5);  //6703(
                callto = callto.substring(0, callto.indexOf(")"));//去掉 )
            }

            String callduraction = jsonObj.get("callduraction").toString();
            String talkduraction = jsonObj.get("talkduraction").toString();
            String srctrunkname = jsonObj.get("srctrunkname").toString();
            String dsttrcunkname = jsonObj.get("dsttrcunkname").toString();

            String pincode = jsonObj.get("pincode").toString();
            String status = jsonObj.get("status").toString();
            String type = jsonObj.get("type").toString();
            String recording = jsonObj.get("recording").toString();
            String didnumber = jsonObj.get("didnumber").toString();

            String agentringtime = jsonObj.get("agentringtime").toString();
            String sn = jsonObj.get("sn").toString();
            String callPath = jsonObj.get("callPath").toString();
            //工号
            String agentname = "";
            if(jsonObj.containsKey("agentname")==true){
                agentname=jsonObj.get("agentname").toString();
            }
            //唯一码
            String sessionid = "";//
            if(jsonObj.containsKey("sessionid")==true){
                sessionid=jsonObj.get("sessionid").toString();
            }

            sql = "insert into CTI_CDR ";
            sql = sql + " ( ID,event,callid,timestart,callfrom, ";
            sql = sql + " callto,callduraction,talkduraction,srctrunkname,dsttrcunkname, ";
            sql = sql + " pincode,status,type,recording,didnumber, ";
            sql = sql + " agentringtime,sn,callpath,agentname,sessionid ) ";
            sql = sql + " values(?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,? )";

            //加上若已关闭了连接,则重新连接--------------------------
            if(connection.isClosed()==true){
                connection.commit(); //java.sql.SQLRecoverableException: ORA-01089: 正在执行立即关闭 - 不允许进行任何操作
                logger.info("dbCdrOneConnect insert() 若已关闭了连接,则重新连接! " + result + " "+ callid+ " "+callfrom+  " " + sql + " "  );
            }
            //------------------------------------------------------

            ps = connection.prepareStatement(sql);
            ps.setString(1, strId);
            ps.setString(2, event);
            ps.setString(3, callid);
            ps.setString(4, timestart);
            ps.setString(5, callfrom);

            ps.setString(6, callto);
            ps.setString(7, callduraction);
            ps.setString(8, talkduraction);
            ps.setString(9, srctrunkname);
            ps.setString(10, dsttrcunkname);

            ps.setString(11, pincode);
            ps.setString(12, status);
            ps.setString(13, type);
            ps.setString(14, recording);
            ps.setString(15, didnumber);

            ps.setString(16, agentringtime);
            ps.setString(17, sn);
            ps.setString(18, callPath);

            ps.setString(19, agentname);
            ps.setString(20, sessionid);
            //logger.debug("dbCDR insert() CDR 执行SQL!" + ps.toString()  );

            result = ps.executeUpdate();
        } catch (Exception e) {
            //e.printStackTrace();
            logger.error("dbCdrOneConnect insert() CDR 执行SQL出错! " + result + " "+ callid+ " "+callfrom+  " " + sql + " " + e.toString());
            //加入 若执行出错 则关闭 连接-------------
            try{
                OracleUtil.closeCon(connection);
            } catch (SQLException exSql) {
                logger.error("dbCdrOneConnect insert() CDR 执行SQL后 关闭 OracleUtil.closeCon 时出错!A " + result + " "+ callid+ " "+callfrom+  " " + sql + " " + exSql.toString());
            }
            //-------------------------------------------------
            return result;
        } finally {
            try
            {
                if (ps != null) {
                    ps.close();//ps需要关闭,不然会出现 java.sql.SQLException: ORA-01000: 超出打开游标的最大数
                }
            } catch (SQLException ex) {
                logger.error("dbCdrOneConnect insert() CDR 执行SQL后 关闭ps时出错! " + result + " "+ callid+ " "+callfrom+  " " + sql + " " + ex.toString());
                //加入 若执行出错 则关闭 连接----------------
                try{
                    OracleUtil.closeCon(connection);//gx230519 加入 若执行出错 则关闭 连接
                } catch (SQLException exSql) {
                    logger.error("dbCdrOneConnect insert() CDR 执行SQL后 关闭 OracleUtil.closeCon 时出错! B " + result + " "+ callid+ " "+callfrom+  " " + sql + " " + exSql.toString());
                }
                //---------------------------------------------------
                return result;
            }

        }
        logger.debug("dbCdrOneConnect insert() CDR 执行SQL成功!" + result + " "+ callid+ " "+callfrom+ " " + sql);
        return result;
    }

    //插入
    public int updateHX(String eventJson) {
        int result=0;
        Statement  stmt=null;
        String updateSql = "";
        try {
            //解析json参数
            JSONObject jsonObj = JSONObject.parseObject(this._eventJson);//

            String type = "";//
            if(jsonObj.containsKey("type")==true){
                type=jsonObj.get("type").toString();
            }else{
                logger.error("dbCdrOneConnect updateHX() eventJson中 不存在type键值 " + " " + " "  +eventJson);
            }
            String recordFile = "";//
            if(jsonObj.containsKey("recording")==true){
                recordFile=jsonObj.get("recording").toString();
            }else{
                logger.error("dbCdrOneConnect updateHX() eventJson中 不存在recording键值 " + " " + " "  +eventJson);
            }
            String sessionId = "";//
            if(jsonObj.containsKey("sessionid")==true){
                sessionId=jsonObj.get("sessionid").toString();
            }else{
                logger.error("dbCdrOneConnect updateHX() eventJson中 不存在sessionid键值 " + " " + " "  +eventJson);
            }
            // 执行更新操作
            if(type.equals("Outbound")==true){
                //outbound 呼出
                updateSql = "UPDATE CTI_CDR SET recordfile = '"+recordFile+"' WHERE sessionid='"+sessionId+"'";
            }else if(type.equals("Inbound")==true){
                //inbound 呼入
                updateSql = "UPDATE CTI_CDR SET recordfile = '"+recordFile+"' WHERE sessionid='"+sessionId+"'";
            }else{
                logger.error("dbCdrOneConnect updateHX() type不是 Outbound 也不是 Inbound 则不做任何处理 " + " " + " "  +eventJson);
                return -2;
            }

            //加上若已关闭了连接,则重新连接-----------------------
            if(connection.isClosed()==true){
                connection.commit(); //java.sql.SQLRecoverableException: ORA-01089: 正在执行立即关闭 - 不允许进行任何操作
                logger.info("dbCdrOneConnect updateHX() 若已关闭了连接,则重新连接! " + " " + updateSql + " "  +eventJson);
            }
            //------------------------------------------------------

            // 创建Statement对象来执行SQL语句
            stmt = connection.createStatement();
            result = stmt.executeUpdate(updateSql);

        } catch (SQLException e) {
            logger.error("dbCdrOneConnect updateHX() 执行SQL出错!" + " " + updateSql + " "  +eventJson);
        } finally {
            // 关闭Statement和Connection
            try {
                if (stmt != null) stmt.close();

            } catch (SQLException se) {
                logger.error("dbCdrOneConnect updateHX() CDR 执行SQL后 关闭 stmt 时出错!A " + updateSql + " "+ eventJson + " " + se.toString());
                // 加入 若执行出错 则关闭 连接----------------
                try{
                    OracleUtil.closeCon(connection);// 加入 若执行出错 则关闭 连接
                } catch (SQLException exSql) {
                    logger.error("dbCdrOneConnect updateHX() CDR 执行SQL后 关闭 OracleUtil.closeCon 时出错! B "  + updateSql + " "+ eventJson + " " + exSql.toString());
                }
                //---------------------------------------------------
            }
        }

        return result;

    }
 
}

调用方法

全局定义

 protected static dbCdrOneConnect  objCDR2;

在 main函数中 执行

       //Oracle 参数
            OracleUtil.oracle_open = prop.getProperty("oracle_open");
            OracleUtil.oracle_url = prop.getProperty("oracle_url");
            OracleUtil.oracle_username = prop.getProperty("oracle_username");
            OracleUtil.oracle_password = prop.getProperty("oracle_password");
            OracleUtil.oracle_jdbcName = prop.getProperty("oracle_jdbcName");
            logger.info("Oracle 参数: " + prop.getProperty("oracle_url") + " -- " + prop.getProperty("oracle_username") + " -- " + prop.getProperty("oracle_password") + " -- " + prop.getProperty("oracle_jdbcName"));
            if (OracleUtil.oracle_open.equals("true") == false) {
                logger.warn("没有启动连接 Oracle 数据库 " + OracleUtil.oracle_open + " " );
            }else {
                try {
                    String str = OracleUtil.connectionTest();//连接测试
                    logger.info("连接测试结果: " + str);
                    logger.info("==========================连接 Oracle 成功!===========================");

                } catch (Exception e) {
                    logger.info("连接 Oracle 失败 " + e.toString() + " ===========================");
                }
            }
            objCDR2 = new dbCdrOneConnect();

当想操作 oracle 时写

int intResult=objCDR2.insert(eventJson);
logger.debug("写Oracle结果: "+intResult+" " + strMsg);

 

标签:ps,jsonObj,java,String,单线程,toString,sql,logger,连接
From: https://www.cnblogs.com/hailexuexi/p/18302963

相关文章

  • java操作Oracle 方式一 ( 连接-》操作-》断开连接 )
    连接-》操作-》断开连接这种方式的特点是每次都是新的连接,单线程,缺点是网络环境不好时连接oracle比较费时。OracleUtil.java基础类代码详见:https://www.cnblogs.com/hailexuexi/p/18302732完整代码dbCDR.javapackagecom.JavaRabbitMQToDataBase.dbOracle;importjava......
  • java操作Oracle 方式二 ( 多线程 )
    多线程方式 也是 连接-》操作-》断开连接  这样的操作过程,只是采用了多线程这种方式的特点是每次都是新的连接,多线程,解决了网络环境不好时连接oracle比较费时,影响主程序其它功能的响应。OracleUtil.java基础类代码详见:https://www.cnblogs.com/hailexuexi/p/1830273......
  • java连接oracle执行sql语句
    一个简单的示例importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassOracleJdbcExample{publicstaticvoidmain(String[]args){//Oracle数据库的JDBCURL,用户名和密码......
  • Java计算机毕业设计教学资料管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:在教育信息化的大潮中,教学资料作为知识传播的重要载体,其管理与利用效率直接影响到教学质量与学生学习效果。传统的教学资料管理方式多依赖于纸质文档......
  • 关于java装饰器模式在ai生成举例不可用的问题
    定义首先描述下定义,然后举例说明。网上定义装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许向对象添加新的功能或职责,同时保持对象类的原始结构。这种模式提供了一种替代继承的机制来扩展功能,因为继承通常是在编译时固定的,而装饰器模式则允许在运行时动态地添加......
  • Java中的静态与动态绑定
    Java中的静态与动态绑定大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!静态与动态绑定的基本概念在面向对象编程中,静态绑定(StaticBinding)和动态绑定(DynamicBinding)是Java中重要的概念。本文将深入探讨这两种绑定方式的特点、使用场景以及在实际开发中......
  • Java毕业设计-基于springboot开发的医院后台管理系统设计与实现-毕业论文(附毕设源代码
    https://download.csdn.net/download/u014740628/88922529医院后台管理系统设计与实现应用技术概述在信息时代背景下,医院后台管理系统的开发成为提升医疗信息处理效率的关键。本文介绍的系统采用B/S架构,结合了MySQL数据库和Java语言进行实现,确保了系统的稳定性和数据的安......
  • Java中的装箱与拆箱详解
    Java中的装箱与拆箱详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!装箱与拆箱的基本概念在Java中,装箱(Boxing)和拆箱(Unboxing)是指将基本数据类型与它们对应的包装类之间进行相互转换的过程。Java为每种基本数据类型提供了对应的包装类,如Integer对应in......
  • Java毕业设计-基于springboot开发的医院药品管理系统设计与实现-毕业论文(附毕设源代码
    Java毕业设计-基于springboot开发的医院药品管理系统设计与实现-毕业论文(附毕设源代码)https://download.csdn.net/download/u014740628/88922533医院药品管理系统开发实践应用技术概述在数字化时代背景下,医院药品管理系统的开发利用了当前流行的技术栈,以满足现代医疗行业......
  • 使用Java实现OAuth2.0认证
    使用Java实现OAuth2.0认证大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!OAuth2.0认证简介OAuth2.0是一种开放标准的授权协议,允许用户授权第三方应用访问其资源,而无需将用户名和密码提供给第三方应用。在Web开发中,OAuth2.0已经成为一种常见的认证机制,用......