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;
}
}