有时候需要连接第三方的各种数据源,总是要去写不同的代码,于是将MaxCompute,Hive,Oracle,Mysql等JDBC连接封装起来,只需要传入不同的参数即可创建一个不同类型的连接池。
连接参数基础类封装
封装了JDBC基础的连接参数,如果不需要这些属性可以继承该类,增加新的属性即可。
DatapublicclassBaseJdbcConnParamimplementsSerializable{/***drivername*/privateStringdriverName;/***IP*/privateStringip;/***dbserverport*/privateIntegerport;/***dbname*/privateStringdbName;/***dbconnectionusername*/privateStringusername;/***dbconnectionpassword*/privateStringpassword;}抽象连接工具类封装
功能如下:
1、构造函数:根据连接参数不同构建不同的连接对象
2、构建具体的连接,子类实现buildConnection()
3、获取连接,构建好之后直接获取getConnection()
/***Description抽象连接工具类父类*Authoritdl*Date/08/:54*/publicabstractclassAbstractConnUtilPextendsBaseJdbcConnParam{/***connectionparams*/protectedfinalPconnParam;/***jdbcconnectionobject*/protectedfinalConnectionconnection;/***构造函数,构造工具类对象*paramconnParam连接参数*/publicAbstractConnUtil(PconnParam){this.connParam=connParam;this.connection=buildConnection();}/***构建连接对象*return连接对象*/protectedabstractConnectionbuildConnection();/***获取连接*/publicConnectiongetConnection(){returnconnection;}}连接池管理
功能如下:
1、根据不同的连接参数,和最大连接数去创建一个对应类型的连接池。
2、获取连接方法,如果连接没有了,等待其他线程释放(最多等待十分钟)
3、释放连接方法,将连接放回连接池,然后唤醒等待的线程
4、关闭连接池所有的连接
/***Description连接池管理*Authoritdl*Date/08/:42*/Slf4jpublicclassDbConnPoolTextendsBaseJdbcConnParam{/***用于存放连接*/privatefinalLinkedListConnectionconnPool=newLinkedListConnection();/***最大连接池数量*/privatefinalIntegermaxPoolSize;privatefinalTconnParam;/***构造函数*paramconnParam连接参数*parammaxPoolSize连接池大小*/publicDbConnPool(TconnParam,IntegermaxPoolSize){this.maxPoolSize=maxPoolSize;this.connParam=connParam;//初始化连接池for(inti=0;imaxPoolSize;i++){connPool.addLast(this.createConnection());}}/***创建数据库连接*return连接*/privateConnectioncreateConnection(){if(connParaminstanceofOracleJdbcConnParam){finalOracleConnUtilutil=newOracleConnUtil((OracleJdbcConnParam)connParam);returnutil.getConnection();}if(connParaminstanceofHiveJdbcConnParam){finalHiveConnUtilutil=newHiveConnUtil((HiveJdbcConnParam)connParam);returnutil.getConnection();}if(connParaminstanceofMysqlJdbcConnParam){finalMysqlConnUtilutil=newMysqlConnUtil((MysqlJdbcConnParam)connParam);returnutil.getConnection();}if(connParaminstanceofMaxComputeJdbcConnParam){finalMaxComputeJdbcUtilutil=newMaxComputeJdbcUtil((MaxComputeJdbcConnParam)connParam);returnutil.getConnection();}thrownewBizException(ResultCode.CONN_TYPE_NOT_SUPPORT);}/***获取连接*return连接*/publicsynchronizedConnectiongetConnection(){if(connPool.size()==0){//thrownewBizException(ResultCode.CONN_POOL_EMPTY_ERR);//最长等待十分钟try{log.info("==========连接池已经空了,请等待其他线程释放==========");wait(10*60*);}catch(InterruptedExceptione){log.info("==========连接池已经空了,等待了10分钟还没有释放,抛出异常==========");e.printStackTrace();thrownewBizException(ResultCode.CONN_POOL_EMPTY_ERR);}}//去除最上面一个连接如果没有连接了,将会抛出异常returnconnPool.removeFirst();}/***用完后释放连接*paramconn要释放的连接*/publicsynchronizedvoidfreeConnection(Connectionconn){//通知连接已经释放notifyAll();this.connPool.addLast(conn);}/***关闭连接池*/publicsynchronizedvoidclose(){for(Connectionconnection:connPool){SqlUtil.close(connection);}}}SQL操作工具类
根据连接对象Connection和数据库房源,封装不同的sql执行。执行SQL核心功能封装。
/***DescriptionSQL操作工具类*Authoritdl*Date/08/:13*/Slf4jpublicclassSqlUtil{/**查询mysql表注释sql*/publicstaticfinalStringSELECT_TABLES_MYSQL="selecttable_name,table_