美文网首页
Java实现数据库断线重连

Java实现数据库断线重连

作者: 超人有点忙 | 来源:发表于2018-11-09 00:12 被阅读0次

最近写了很多硬件设备的采集程序,由于数据的分析和页面的展示都是通过数据库服务器上的oracle数据库计算并且发送到前台可视化显示的。这其中就有个问题就是,一旦数据库服务器停电了或者宕机了,那么必须得有人手动重启应用服务器的程序。所以这里需要有增加一个断线重连的功能。
直接上代码


image.png

如上图所示,OracleWriter是接收并解析好的数据,insert到数据库中,在这个类的构造方法中通过scheduleAtFixedRate方法每隔十秒调用一下MonitorThread线程的逻辑,我们来主要看一下MonitorThread这个监控类。

package com.junlai.wifi.server;

import org.apache.log4j.Logger;

import java.sql.*;

public class MonitorThread implements Runnable {

    private static final Logger logger = Logger.getLogger(MonitorThread.class);

    private String url;

    private String user;

    private String password;


    public MonitorThread( String url, String user, String password) {
        this.url = url;
        this.user = user;
        this.password = password;
    }

    public void run() {
        try {
            System.out.println("MonitorThread~~~~~~~~~~~~~!!!!");
            String sql = "select 1 from dual";
            Statement statement = OracleWriter.conn.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            /*while (resultSet.next()) {

            }*/
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();

                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();

                }
            }

        } catch (Exception e) {
            System.out.println("捕获到了异常!!!!!!!!!!!!");
            e.printStackTrace();
            logger.error("数据库连接中断,尝试重连" + e.getMessage());
            try {
                OracleWriter.conn = null;
                OracleWriter.conn = DriverManager.getConnection(url, user, password);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }

    }
}


package com.junlai.wifi.server;

import org.apache.log4j.Logger;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

/**
 * Created by liz on 2018/7/9.
 */
public class OracleWriter implements WriterInterface{

    private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private static final Logger logger = Logger.getLogger(OracleWriter.class);

    public static volatile Connection conn = null;

    private ScheduledExecutorService oraclePool = Executors.newScheduledThreadPool(1);

    public static final int ORACLE_MONITOR_PERIOD = 10;

    public Connection getConn() {
        return conn;
    }

    public void setConn(Connection conn) {
        this.conn = conn;
    }

    static {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
        }
    }

    public OracleWriter(String url, String user, String password) {
        try {
            conn = DriverManager.getConnection(url,user,password);
            conn.setAutoCommit(true);
            oraclePool.scheduleAtFixedRate(new MonitorThread(url,user,password),0,ORACLE_MONITOR_PERIOD, TimeUnit.SECONDS);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
        }
    }
}

思路

1.通过"select 1 from dual"来检测数据库是否还正常。(如果正常则应该返回"1")
2.如果服务器这个时候已经断了,则直接捕获到异常。
3.为了高效只有一个static的Connection连接,不主动关闭。但是在异常中我们手动的将OracleWriter的conn的连接对象设为null(我尝试了close,直接报错了。)等待GC把他回收,然后再把新创建的conn赋值给OracleWriter的conn。
4.大功告成,很简单吧,经了解到常见的数据库连接池的断线重连的实现原理也类似是这样。

相关文章

  • Java实现数据库断线重连

    最近写了很多硬件设备的采集程序,由于数据的分析和页面的展示都是通过数据库服务器上的oracle数据库计算并且发送到...

  • 状态同步的断线重连

    最近陆陆续续在给游戏做断线重连相关的工作,大厅服的断线重连问题不是很大,难点主要在于战斗中的断线重连。断线重连要解...

  • 断线重连问题综述

    断线重连主要涉及到几个问题: 判定断线 怎么重连 重连后如何还原游戏环境 判定断线有两种方式,(1)是超时判定断线...

  • 树莓派Wi-Fi断线重连

    实现 WiFi 断线自动重连。原理是用 Python 监测网络是否断线,如果断线则重启网络服务。 配置无线网连接 ...

  • Redis主从复制之数据同步

    前言:redis数据同步是redis主从复制的第二个阶段。该阶段实现slave初次连接或断线重连后redis数据库...

  • 断线重连

    今天看了下之前游戏登录相关逻辑,重新整理下断线重连的一些做法。 首先,介绍下断线的几种常见情况:情况一:客户端网络...

  • 断线重连

    using System; using System.Collections; using System.Coll...

  • Webscoket 断线重连

  • 定时断线重连

    客户端断线重连机制。客户端数量多,且需要传递的数据量级较大。可以周期性的发送数据的时候,使用。要求对数据的即时性不...

  • 蓝牙断线重连

    http://www.cocoachina.com/bbs/read.php?tid-1722597.html

网友评论

      本文标题:Java实现数据库断线重连

      本文链接:https://www.haomeiwen.com/subject/jxogxqtx.html