`

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

 
阅读更多
前提: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组件,...

    在Oracle 8x实现自动断开后再连接

    要实现后台任务自动对超过一定时间空闲连接的处理,首先第一步工作就是要从所有与数据库服务器的连接中识别出那些连接需要处理,也就是需要获得与服务器连接的每个用户的登陆时间及其最后一次操作后的空闲时间。...

    以数据库为核心的道路纵断面CAD设计.pdf

    该方法通过VB程序与AutoCAD软件的连接,使得设计师能够基于数据库信息进行纵断面设计,并且能够实现设计数据的人机交互修改,极大提高了设计的效率和质量。 CAD技术是计算机辅助设计的简称,它是一种将计算机技术...

    SQLiteStudio优雅调试Android手机数据库Sqlite(推荐)

    * 断掉USB连接后,工具将显示不了数据库内容,只看到数据库名称。 总结 在本文中,我们介绍了使用SQLiteStudio来调试Android手机数据库Sqlite的方法。SQLiteStudio是一个强大的工具,提供了一个可视化的界面来管理...

    关系数据库语言SQL知识介绍.pptx

    自1986年被美国国家标准局(ANSI)确立为关系数据库的标准以来,SQL得到了国际标准化组织(ISO)的认可,并广泛应用于各种大型数据库系统中。 SQL的主要特点包括: 1. 综合统一:SQL集数据查询、数据操纵、数据定义和...

    地理信息系统与嵌入式数据库——移动心电监护系统.pdf

    - **频繁的断接性**:由于移动设备经常处于不稳定或无网络连接的状态,EMDBS需要具备处理这种频繁断接的能力。 - **网络条件的多样性**:不同移动设备所处的网络环境差异较大,EMDBS必须能够适应各种不同的网络条件...

    焊接接头静载强度数据库的设计

    焊接技术的优势在于其连接功能强、成本低、速度快且焊接后的结构整体性好。焊接接头的强度和可靠性直接决定了焊接结构的安全性。因此,对焊接接头进行准确的强度计算至关重要。 焊接接头的强度计算,主要是分析和...

    Oracle10g安装图解WINXP

    14. **安装完成和验证**: 完成安装后,进行必要的验证,如启动数据库服务、检查数据库连接等,确保一切正常。 以上就是Oracle 10g在Windows XP下的详细安装步骤。通过文档"Oracle10g安装图解WINXP.doc",你可以获得...

    图书管理系统 源代码及设计文档.rar

    - **数据库连接**:查看数据库连接代码,了解如何使用SQL语句进行CRUD操作。 - **错误处理与日志记录**:良好的系统会包含错误捕获和日志记录机制,便于调试和追踪问题。 6. **性能优化**: - **SQL查询优化**:...

    CASIO5800隧道断面放样程序全线型

    平面数据库子程序(PM-SJ) 此子程序用于根据输入的里程S查询并返回相应的线元数据。 - **条件判断**:根据里程S的范围判断当前线元类型,并返回相应的起始坐标、方位角、长度、半径等信息。 ##### 5. 左线高程...

    salesmanagement-MFC.zip_数据库编程_Visual_C++_

    《基于MFC的连锁商店销售管理系统与数据库编程详解》 在信息技术飞速发展的今天,数据库编程与用户界面设计已经成为软件开发的重要组成部分。本系统“连锁商店销售管理系统”就是结合了这两者的典型应用,采用...

    java进销存管理系统

    销售报表的生成则依赖于JDBC(Java Database Connectivity)连接数据库,提取销售数据并进行统计分析,帮助企业了解销售趋势,优化销售策略。 其次,库存管理是企业运营的重要环节。Java进销存管理系统通过实时监控...

    vb 企业进销存管理系统

    开发者在源代码中预设了数据库连接字符串,用户需根据自己的实际情况修改,包括数据库服务器名、数据库名、用户名和密码等信息。详细配置步骤通常会在资料文档中提供,确保正确配置后,系统才能正常读写数据。 三、...

    springboot2.0版本中文文档

    在数据库连接方面,SpringBoot2.0支持JDBC 4.3和JPA 2.2,提供更好的数据访问性能和事务管理。同时,它还集成了更多的数据源选项,如R2DBC,支持反应式数据库连接。 微服务集成也是SpringBoot2.0的一大亮点。它增强...

    本科毕业设计---基于java超市账单管理系统说明书含源文件.doc

    5. **JDBC**:Java Database Connectivity,Java数据库连接,是Java与数据库进行交互的标准接口,实现了Java程序对数据库的操作。 6. **HTML/CSS/JavaScript**:用于构建用户界面,其中Div+CSS用于布局和样式设置,...

    建立消费者关系管理系统

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

Global site tag (gtag.js) - Google Analytics