`

数据库断连后如何重新获得数据库连接

 
阅读更多
前提:DBPool连接池自身有数据库断连后获取重连的机制

问题:执行某条sql时连接断开,此时此条sql不会被执行,并且若不进行特殊处理,程序会继续往下执行,

此时会出现数据丢失现象。

解决思路:1、判断是否是因为连接被断开引起的异常

          2、若是连接被断开引发的异常,则循环持续等直到重新获得连接

          3、重新获得连接后,先执行报错时执行的sql

          4、接着往下执行原程序流程






package com.info.db.common;

import java.sql.Connection;
import java.sql.SQLException;

import com.info.db.DbHelper;
import com.info.db.DbOperate;
import com.info.log.SysLog;

/ **
* @description 测试连接池是否能自动重连接
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
* @since 1.0
*/
public class ConnectionPoolUtil {
    private DbOperate operate;

    private long second;

    / **
     * 初始方法
     *
     * @param operate
     *            数据库操作对象
     * @param second
     *            重连等待时间
     */
    public ConnectionPoolUtil(DbOperate operate, long second) {
        this.operate = operate;
        this.second = second;
    }

    / **
     * 处理数据库断连引发的问题
     *
     * @description
     * @author xiaoxiong
     * @date 2012-10-23
     * @version 1.0.0
     * @param sql
     *            异常产生时执行的sql,保证数据完整性
     */
    public boolean ConncetionHandle(String sql) {
        boolean result = ConncetionHandle(); // true为sql异常
        // 数据库重连后继续执行原有sql
        if ( !result) {
            try {
                operate.execute(sql);
            } catch (Exception e) {
                SysLog.error(sql);
            }
        } else {
            SysLog.error(sql);
        }
        return result;
    }

    / **
     * 处理数据库断连引发的问题
     *
     * @description
     * @author xiaoxiong
     * @date 2012-10-23
     * @version 1.0.0
     */
    public boolean ConncetionHandle() {
        Connection connetion = null;

        long time = second * 1000; // 单位为毫秒
        boolean flag = true; // 判断是否正常,默认为连接池是连接的
        // 判断是sql语句异常还是断连引发的异常
        boolean result = false;

        try {
            connetion = operate.getDefaultPool().openConnection();
            if (connetion == null) {
                result = false;
            } else {
                result = true;
            }
            operate.getDefaultPool().closeConnection(connetion);
        } catch (SQLException e) {
            result = false;
        }
        if ( !result) {
            SysLog.error("Connect DataBase Failed,Please contact Administrator!");
            //SysLog.error("数据库连接已经断开,请检查数据库服务器!");

            // 循环重连
            do {
                try {
                    connetion = operate.getDefaultPool().openConnection();
                    if (connetion == null) {
                        flag = false;
                    } else {
                        flag = true;
                    }
                    operate.getDefaultPool().closeConnection(connetion);
                } catch (SQLException e) {
                    flag = false;
                }
                if ( !flag) {
                    try {
                        Thread.sleep(time); // 连接断开时给他延时time时间
                    } catch (InterruptedException e) {
                        SysLog.error(e.getMessage());
                    }
                }
            } while ( !flag);
            SysLog.error("Connect DataBase Success!");
           // SysLog.error("数据库连接已恢复!");
        }
        return result;
    }

    public static void main(String[] args) {
        ConnectionPoolUtil testConnectionPool = new ConnectionPoolUtil(
            DbHelper.getOperator("bas"), 5);
        testConnectionPool.add();
    }

    private void add() { // 测试方法
        for (int i = 0; i < 1000; i++ ) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            String sql = "INSERT INTO test ([name],[date],[intsum]) VALUES "
                         + "('name" + i + "',NULL," + i + ")";
            SysLog.info(sql);
            try {
                operate.execute(sql);
            } catch (SQLException e) {
                e.printStackTrace();
                ConncetionHandle(sql);
            }
        }
    }
}

分享到:
评论

相关推荐

    简单数据库服务器调试(源码)

    SQL只用到一种连接方式,而Oracle用到了ADO和OO4O(部分功能尚未完成), 支持SQL语句执行(支持SQL Server和Oracle语法,并支持关键字高亮)支持导出数据库表结构为SQL脚本.... 连接Oracle服务器需要安装OO40组件,...

    数据库系统概念复习总结.pdf

    E-R实体-联系模型 基于对象的数据模型 半结构化数据模型 1.4 数据库语⾔ DDL定义数据库模式,以及数据库操纵语⾔(DML)来表达数据库查询和更新 DDL的⼀些⼀致性约束:域约束、参照完整性、断⾔、授权。DDL的输出...

    MySQL Sleep连接过多问题解决方法

    后会发现数据库中有很多这样的进程: 那么造成sleep的原因,有三个,下面是mysql手册给出的解释: 1.客户端程序在退出之前没有调用mysql_close().[写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接。。。] 2...

    建立消费者关系管理系统

    断发展的Java项目需要精通Java数据库连接,MySQL,HTTP和JSpring框架。你应该学习Spring核心/ MVC,ORM框架和Hibernate来完成这个项目。您将为网络平台开发一个管理系统,让社区管理人员修改和访问消费者数据,以...

    基于J 2EE的三层B /S企业信息系统

    分析了J 2EE与企业数据库之间的接口连接问题 ,最后结合实际情况 ,给出了一个银行企业信息系 统的设计方案,并讨论了系统代码实现的关键技术问题。该系统具有可伸缩性好、 易维护、 使用灵 活等特点。  科学技术的...

    华为编程开发规范与案例

    而pDBFat是数据库的起始地址,如果pSysHead-&gt;dbf_count值异常过大,将导致pDBFat值超过最大内存地址值,随后进行的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机的现象。...

    CISCO路由之排除路由故障

     Dijkstra算法运行在LS数据库上来获得每个被通告路由的最佳路径。  debug isis update-packets  debug isis snp-packets  以上两个调试帮助故障排除LSP洪泛问题和链路状态数据库同步。  路由没有到达网络远...

    二十三种设计模式【PDF版】

    如果你能记起以前问题的细节和怎么解决它的,你就可以复用以前的经验而不需要重新发现它。然而,我们 并没有很好记录下可供他人使用的软件设计经验。 学习 GoF设计模式的重要性 著名的 EJB 领域顶尖的专家 Richard...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则不会进入主窗口,整个程 序结束运行 } 主函数必须这么写,...

    易语言 茶凉专用模块

    子程序 到短路径, 文本型, 公开, 取指定路径的短路径名(返回收缩后的路径,无效返回空文本)如: c:\program files\ 收缩后为:C:\PROGRA~1\ .参数 文件名, 文本型, , 原路径 .子程序 到任意进制, 文本型, 公开, 可以将...

    MAPGIS地质制图工具

    剪断相交线:选择线剪断相交线或者直接拉一条线剪断相交线,自相交及节点断线。 等分线:定距离或定段数等分一条线。还可以随机按偏移量自动等分线。 图元筛选:根据参数或者属性筛选图元,还可选择相同的图元。 ...

Global site tag (gtag.js) - Google Analytics