问题描述:
今天遇到执行一个jdbc hive sql 时,报以下异常:
2021-02-04 12:05:01 [cn.getech.data.manager.utils.HiveJdbcUtil#closeConnection]-[138]-[Thread-50] java.sql.SQLException: Error while cleaning up the server resources
at org.apache.hive.jdbc.HiveConnection.close(HiveConnection.java:641)
at cn.getech.data.manager.utils.HiveJdbcUtil.closeConnection(HiveJdbcUtil.java:135)
at cn.getech.data.manager.service.strategy.ManagerHiveTemplate.closeHiveUtil(ManagerHiveTemplate.java:108)
at cn.getech.data.manager.service.strategy.ManagerHiveTemplate.getLong(ManagerHiveTemplate.java:135)
at cn.getech.data.manager.service.strategy.ManagerHiveTemplate.getLongValue(ManagerHiveTemplate.java:50)
at cn.getech.data.manager.service.strategy.impl.DataSourceHiveStrategy.getTableRowNum(DataSourceHiveStrategy.java:121)
at cn.getech.data.manager.service.impl.DataQualityInfoServiceImpl.buildQualityReport(DataQualityInfoServiceImpl.java:166)
at cn.getech.data.manager.service.impl.DataQualityInfoServiceImpl$$FastClassBySpringCGLIB$$df628659.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
at cn.getech.data.manager.service.impl.DataQualityInfoServiceImpl$$EnhancerBySpringCGLIB$$98bf66b7.buildQualityReport()
at cn.getech.data.manager.service.impl.BuildDataQalityReportServiceImpl.buildDataQalityReport(BuildDataQalityReportServiceImpl.java:51)
at cn.getech.data.manager.task.DataQualityTask.buildDataQalityReport(DataQualityTask.java:27)
at cn.getech.data.job.datamanager.DataManagerMoveJob.buildDataQalityReportHandler(DataManagerMoveJob.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
其实问题的本质就是,statment语句执行一个sql时,在指定的时间内没有获取到结果,然后报超时异常后,紧接着去关闭connection 连接,而导致的异常。
问题解决:
如果我们的sql执行时间比较久,则将statment语句的查询时间设置久一点,对应的代码如下:
private void conn () {
try {
Class.forName(driverName);
con = DriverManager.getConnection(url, user, pwd);
stmt = con.createStatement();
stmt.setQueryTimeout(1800);
} catch (ClassNotFoundException e) {
XxlJobLogger.log("ClassNotFoundException获取hive数据连接异常={}",e.getMessage());
} catch (SQLException e){
XxlJobLogger.log("获取hive数据连接异常");
}
}
其中stmt 为 java.sql.Statement 对象实例