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

前提: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);
            }
        }
    }
}

猜你喜欢

转载自xiaoxiongsoft.iteye.com/blog/2024563