banner
Matt

Matt

Matt-xlog
telegram
github

【JAVA】【工具类】hiveカスタム接続プール

import org.apache.hadoop.security.UserGroupInformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.PrivilegedAction;
import java.sql.*;
import java.util.LinkedList;

/*** クラス名: ImpalaJdbcUtils
 * * 説明:impala jdbcのツールクラス
 * * カスタム接続プール
 * * **/
public class ImpalaJdbcUtils {
    private static final Logger log = LoggerFactory.getLogger(ImpalaJdbcUtils.class);
    /*** 説明:ドライバークラス <br>*/
    private static String DRIVER_CLASS = "org.apache.hive.jdbc.HiveDriver";
    private static String CONNECTION_URL = "jdbc:hive2://*****/default;principal=impala/";
    /*** 接続プール**/
    private static LinkedList<Connection> pool = new LinkedList<Connection>();//初期化10個の接続

    static {
        try {
            for (int i = 0; i < 15; i++) {
                Connection conn = getImpalaConnection();
                //接続を取得
                pool.add(conn);
            }
        } catch (Exception e) {
            log.error("データベース接続プールの初期化に失敗しました。設定を確認してください", e);
        }
    }
    /*** 接続プールから接続を取得**/
    public static Connection getConnection() throws SQLException {
        // 接続プールから1つの接続を取り出す
        Connection conn = null;
        // 接続がタイムアウトしているかテストし、タイムアウトしている場合は再接続
        try {
            conn = pool.removeFirst();
            //以下のリンクを実行し、異常がないか確認
            String sql = "show DATABASES";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            rs.close();
            ps.close();
        }catch (Exception e){
            log.warn("接続異常、再接続を試みます!");
            conn = getImpalaConnection();
        }
        // 最初の接続を削除して返す
        log.info("接続を1つ取り出し、残り " + pool.size() + "個の接続があります!");
        return conn;
    }

    /*** @Description 接続を解放する***/
    public static void releaseConnection(Connection conn) {
        pool.add(conn);
        log.info("接続を接続プールに戻しました, 数量:" + pool.size());
    }
    /*** @Description impala接続を取得* **/
    public static Connection getImpalaConnection() {
        try {
            Object o = UserGroupInformation.getLoginUser().doAs((PrivilegedAction<Object>) () -> {
                Connection connection = null;
                try {
                    Class.forName(DRIVER_CLASS);
                } catch (ClassNotFoundException e) {
                    log.error("impalaドライバーの読み込みに失敗しました", e);
                }
                try {
                    connection = DriverManager.getConnection(CONNECTION_URL);
                } catch (SQLException e) {
                    log.error("jdbc接続の取得に失敗しました", e);
                }
                return connection;
            });
            return (Connection) o;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /*** jdbc接続を閉じる* **/
    public static void disconnect(Connection connection, ResultSet res, PreparedStatement ps) {
        try {
            if (res != null){
                res.close();
            }
            if (ps != null){
                ps.close();
            }
            if (connection != null) {
                connection.close();
                ImpalaJdbcUtils.releaseConnection(connection);
            }
        } catch (SQLException e) {
            log.error("jdbc接続の閉鎖に失敗しました", e);
        }
    }

    //接続プールを使用しない
    public Connection getConnectSync(){
        try {
            Object o = UserGroupInformation.getLoginUser().doAs((PrivilegedAction<Object>) () -> {
                Connection connection = null;
                try {
                    Class.forName(DRIVER_CLASS);
                } catch (ClassNotFoundException e) {
                    log.error("impalaドライバーの読み込みに失敗しました", e);
                }
                try {
                    connection = DriverManager.getConnection(CONNECTION_URL);
                } catch (SQLException e) {
                    log.error("jdbc接続の取得に失敗しました", e);
                }
                return connection;
            });
            return (Connection) o;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}         
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。