日期:2014-05-16  浏览次数:20496 次

数据库断连后如何重新获得数据库连接
前提: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语句异常还是断连引发的异常