Hive数据库连接-连接池实现

2023-11-01

Hive数据库连接-连接池实现

通过HiveJDBC获取Hive的连接Connection,下面我们简单介绍HiveJDBC数据库连接实现

HiveJDBC配置文件

连接池配置文件hive-jdbc.properties

# 初始化连接池数
db.jdbcPoolInitSize=5

# HIVE的Driver,不需要修改
db.driver=org.apache.hive.jdbc.HiveDriver

# hiveserver2 的ip地址
db.ip=hadoop01

# hiveserver2 的客户端端口,默认为10000
db.port=10000

# Hive连接是否开启Kerberos认证
hive.iskrb5=false

# kerberos认证开启hive认证主体
hive.principal=hive/hadoop01@HADOOP.COM

# HIVE数据库名称
db.name=dbname

# 用户名
db.username=username

# 密码
db.password=password

# 数据库HDFS目录
storage.directory=/user/hive/warehouse

读取HiveJDBC配置文件

public class HiveJdbcPer {

    /**
     * hive-jdbc.properties配置文件Properties
     */
    public static Properties properties = PropertiesUtil.getProperties("hive-jdbc.properties");

    /**
     * 初始化连接池数
     */
    static String jdbcPoolInitSize = properties.getProperty("db.jdbcPoolInitSize");

    /**
     * Hive JDBC Driver类
     */
    static String dbDriver = properties.getProperty("db.driver");

    /**
     *  hiveserver2 的ip地址
     */
    static String dbIP = properties.getProperty("db.ip");

    /**
     * hiveserver2 的端口
     */
    static String dbPort = properties.getProperty("db.port");

    /**
     * hiveserver2连接数据库名称
     */
    public static String dbName = properties.getProperty("db.name");
    /**
     *
     * hiveserver2连接用名名称
     */
    final static String dbUsername = properties.getProperty("db.username");

    /**
     * hiveserver2连接用名密码
     */
    final static String dbPassword = properties.getProperty("db.password");

    /**
     * hiveserver2连接是否开启Kerberos认证
     */
    final static String iskrb5 = properties.getProperty("db.iskrb5");

     /**
     * hiveserver2开启Kerberos认证主体
     */
    final static String krb5Principal = properties.getProperty("hive.principal")

    /**
     * Hive集群上的HDFS存储目录
     */
    static String storageDirectory = properties.getProperty("storage.directory");

}

HiveJDBC连接池类

连接池通过实现javax.sql.DataSource

public class HiveJdbcPool implements DataSource {
    private static final Logger LOGGER = LoggerFactory.getLogger(HiveJdbcPool.class);

    /**
     * @Field: Connections
     * 使用Vector来存放数据库链接,
     * Vector具备线程安全性
     */
    private static final Vector connections = new Vector();

    static {
        //在静态代码块中加载db.properties数据库配置文件
        try {
            //数据库连接池的初始化连接数大小
            int jdbcPoolInitSize = Integer.parseInt(HiveJdbcPer.jdbcPoolInitSize);
            StringBuilder urlSB = new StringBuilder();
            //加载数据库驱动
            Class.forName(HiveJdbcPer.dbDriver);
            urlSB.append( "jdbc:hive2://").append(HiveJdbcPer.dbIP).append(":").append(HiveJdbcPer.dbPort);
            if(HiveJdbcPer.iskrb5.equalsIgnoreCase("true")){
                urlSB.append("/;principal=").append(HiveJdbcPer.krb5Principal);
            }
            String dbURL = urlSB.toString();
            for (int i = 0; i < jdbcPoolInitSize; i++) {
                Connection conn = DriverManager.getConnection(dbURL, HiveJdbcPer.dbUsername, HiveJdbcPer.dbPassword);
                LOGGER.debug("获取到了链接:{}", conn);
                //将获取到的数据库连接加入到Connections集合中,Connections此时就是一个存放了数据库连接的连接池
                connections.addElement(conn);
            }
        } catch (SQLException e) {
            LOGGER.error(" 创建数据库连接失败!", e.getMessage());
            try {
                throw new SQLException(" 创建数据库连接失败!");
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    @Override
    public Connection getConnection() throws SQLException {
        synchronized (connections) {
            //如果数据库连接池中的连接对象的个数大于0
            if (connections.size() > 0){
                final Connection conn = (Connection) connections.remove(0);
                //注意需要添加OracleConnection.class,不然JdbcUtil.createOracleLob创建Clob会报错无法转换
                return (Connection) Proxy.newProxyInstance(HiveJdbcPool.class.getClassLoader(), new Class[]{Connection.class}, (proxy, method, args) -> {
                    if (!method.getName().equals("close")) {
                        return method.invoke(conn, args);
                    } else {
                        //如果调用的是Connection对象的close方法,就把conn还给数据库连接池
                        connections.addElement(conn);
                        LOGGER.debug(conn + "被还给Connections数据库连接池了!!");
                        LOGGER.debug("Connections数据库连接池大小为" + connections.size());
                        return null;
                    }
                });
            } else throw new RuntimeException("对不起,数据库连接失败!");
        }
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }
}

HiveUtil工具类获取连接池中连接

public class HiveJdbcUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(HiveJdbcUtil.class);

    /**
     * @Field: pool
     *          数据库连接池
     */
    private static HiveJdbcPool pool = new HiveJdbcPool();


    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = pool.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            LOGGER.error("Hive JDBC 获取连接池中连接异常!");
        }
        return conn;
    }

    public static ResultSet executeQuery(Connection conn, String sqlstring){
        Statement st;
        ResultSet rs = null;
        try {
            st = conn.createStatement();
            rs= st.executeQuery(sqlstring);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    /**
     * @Method: release
     * @Description: 释放资源,
     * 释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
     *
     * @param conn Connection
     * @param st Statement
     * @param rs ResultSet
     */
    public static void release(Connection conn, Statement st, ResultSet rs){
        if(rs!=null){
            try{
                LOGGER.debug("关闭存储查询结果的ResultSet对象");
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(st!=null){
            try{
                LOGGER.debug("关闭负责执行SQL命令的Statement对象");
                st.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }

        if(conn!=null){
            try{
                LOGGER.debug("关闭Connection数据库连接对象");
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive数据库连接-连接池实现 的相关文章

随机推荐

  • golang 分布式框架Origin学习笔记

    最近项目的后端需求是全球同服的 在使用语言方面确定了为golang之后 了解了一下当前的一些goalng游戏服务器框架 终于在leaf pitaya 等众多框架中选择了 Origin 主要是因为它是分布式框架 微服务架构 比较匹配做全球同服
  • curl: (3) [globbing] error: bad range specification after pos 150的解决方法

    在线上服务器上执行下面的命令 curl vo dev null http 120 52 72 46 80 fileshare3010 dfiles eu c3pr90ntcsf0 auth 1375626538db3c073c81647e8
  • 拨号软件隐藏手机号码_华为手机的拨号键有大用处,不仅能用来打电话,还有4个隐藏功能...

    手机最本质的作用就是用来与别人进行通话 所以每一部手机都拥有拨号按键 但你知道吗 华为手机的拨号按键除了能够进行拨打电话以外 还隐藏着5个功能 那么是哪些隐藏的功能呢 笔者就来为大家讲解下吧 手机的入网串码 很多人都不知道如何查找手机的入网
  • 猿如意|手把手教你下载、安装和配置PyCharm社区版

    手把手教你使用猿如意下载 安装和配置PyCharm社区版 希望能帮助到有需要的童鞋 文章目录 前言 一 下载安装猿如意 二 安装PyCharm社区版 1 通过猿如意找到PyCharm下载位置 2 安装PyCharm 三 对PyCharm社区
  • idea调试如何回退到上个断点

    我们使用idea运行java代码时 打了几个断点 想看参数 但是一不小心 手一抖 就过去了 此时如何回退到上一步呢 看图说话 如下 我有两个方法 分别有两个断点 1 此时我们的断点已经到getTest方法了 如何回到上一个method方法中
  • 我要进大厂第二讲:如何准备好一场大厂面试

    我要进大厂第二讲 如何准备好一场大厂面试 本文是我要进大厂第二讲 如何准备好一场大厂面试 4年经验 我有个同事跟我说过 他曾经的老大告诉他们 无论是否跳槽 每年都应该出去面试一下 我个人对这个想法持支持态度 至少在我们还年轻的时候应该尽量这
  • 求数组最小值和最小值的下标

    描述 定义一个含10个元素的整型数组 从键盘输入数组所有元素的值 并求该数组中的最小值和最小值的下标 如果最小值在数组中出现多次 输出最小的那个下标 输入 10个整数 输出 最小值和最小值的下标 如果最小值在数组中出现多次 输出最小的那个下
  • (U+FF1A)

    Package inputenc Error Unicode character U FF1A 错误原因 冒号 是中文格式
  • anaconda的envs的其中一个环境目录下,没有python.exe文件,只有conda-meta和scripts

    进入Anaconda软件中 删除该环境 左下角create重新创建环境 系统就会重新配置python等相关文件
  • 19-jQuery快速开发②

    jQuery快速开发 1 jQuery 属性操作 1 1 元素固有属性值 prop 1 2 元素自定义属性值 attr 1 3 数据缓存 data 1 4 案例 购物车案例模块 全选 2 jQuery 文本属性值 2 1 jQuery内容文
  • 数据库空闲连接超过最大wai_timemout时间,数据库会强行断开空闲的链接,dbcp解决方案

    虚拟空间的mysql数据库常设得很低 如wait timeout 100 在java web 应用中使用dbcp做为连接池 当数据库重启或数据库连接超过设置的最大timemout时间 数据库会强行断开已有的链接 此时当web程序访问数据库时
  • Qt5 学习之路及嵌入式开发教程18:Qt5主窗口---字体字号状态栏

    Qt5 学习之路及嵌入式开发教程18 Qt5主窗口 字体字号状态栏 这次任务要完成Qt5主窗口的界面设计第五部分 字体字号状态栏功能实现 无法用控件完成 只能用代码完成 步骤 1 在mainwidow h中添加代码 include
  • 政策效应,基于反事实框架

    政策效应 基于反事实框架 一 Edited by Linhao Cui 根据陈强高级计量经济学及stata应用等书籍自己整理得到 仅供学习交流使用 从一个基准的理想政策评价模型出发 Y i
  • Oracle插入或修改数据怎么也不行的解决方法

    今天在公司操作数据库 在删除一条数据的时候忘记提交事务了 之后就去添加别的了 但是后来发现怎么也添加不上 所以觉的是事务锁住了 1 直接判断未提交事务引起的表的行锁 1 1判断哪个SESSION执行了DML Insert Update De
  • C语言-蓝桥杯-算法训练 印章

    问题描述 共有 n 种图案的印章 每种图案的出现概率相同 小A买了 m 张印章 求小A集齐 n 种印章的概率 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案 保留4位小数 样例输入 2 3 样例输出 0 7500 解题思路 共
  • PPTP穿透NAT之深入分析

    PPTP穿透NAT之深入分析 bytxl的专栏 CSDN博客大家好 现在是人静时分 我公司人员都以溜光 只有我还在面对computer 在经过不解 迷惑 结论之后 现与大家分享结果 感谢朋友Zyliday 见贤思齐的实验帮助 在研究技术原理
  • URP自定义后处理(相机滤镜)

    前言 之前做游戏一直想弄个可以实时触发相机滤镜的效果 自处找了教程和资料 想要做到自定义效果的话最好办法是在unity 内部实现 这个办法比较硬核 其实不适合我这样的小白 所以我在实现的过程中非常痛苦 我用的unity URP 模式其实自带
  • OMG!解释执行java字节码文件的命令

    美团一面 收到了HR的信息 通知我去面试 说实话真的挺紧张的 自己准备了近一个月的时间 很担心面试不过 到时候又后悔不该 裸辞 自我介绍 spring的IOC AOP原理 springmvc的工作流程 handlemapping接收的是什么
  • python中的list格式化输出

    在使用python时 我们经常会用到列表 list 由于它可以保存不同类型的数据 因此很多场景下我们都会使用它来保存数据 在写代码的过程中我们经常想要显示list的内容 直接调用print又会显得很丑 还会带着方括号 和逗号 这个太丑 又不
  • Hive数据库连接-连接池实现

    Hive数据库连接 连接池实现 通过HiveJDBC获取Hive的连接Connection 下面我们简单介绍HiveJDBC数据库连接实现 HiveJDBC配置文件 连接池配置文件hive jdbc properties 初始化连接池数 d