最近公司在大规模应用phoenix,在应用phoenix的过程中,发现客户端的链接有大量CLOSE_WAIT状态,无法释放导致服务器资源耗尽,影响应用程序。我采用简单的jdbc连接,并在finally中关闭该连接。查询相关资料,CLOSE_WAIT是服务端已关闭了链接,但客户端未关闭该连接。但看代码应该是已经关闭了链接,所以不知道为啥,链接一直保持在该状态。代码如下,希望可以得到大神的指点。
try { String pageQuerySql = "select * from TABLE1" Class.forName("org.apache.phoenix.queryserver.client.Driver"); log.info("phoenix query server 驱动加载成功! "); connection=DriverManager.getConnection("jdbc:phoenix:thin:url=http://8.99.5.188:8765;serialization=PROTOBUF"); log.info("phoenix query server 连接创建成功! "); statement = connection.createStatement(); resultSet= statement.executeQuery(pageQuerySql); connection.commit(); } } catch (Exception e) { log.error("execute sql=[{}] happen error=[{}]", pageQuerySql, e.getMessage()); throw new DataSourceException(String.format("sql=%s, error message=%s", pageQuerySql, e.getMessage())); } finally { if(StringUtils.equalsIgnoreCase(jdbcStrategyDto.getDbType(), StrategyConstants.Service.PHOENIX_NAME)){ try { if(resultSet != null){ resultSet.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); log.error("phoenix resultSet关闭失败!{}",throwables.getMessage(),throwables); } try { if(statement != null){ statement.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); log.error("phoenix statement关闭失败!{}",throwables.getMessage(),throwables); } try { if(connection != null){ connection.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); log.error("phoenix connection关闭失败!{}",throwables.getMessage(),throwables); } log.info("phoenix连接关闭成功!"); }else{ HikariDataSourcePoolUtils.closeSession(connection, preparedStatement, resultSet); } }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。