我有一些java多线程代码,可以用很多次从Impala和JDBC进行计算读取。 我的问题是,在我的集群中,它有6个节点,连接并没有被代码关闭,尽管我插入了close()语句。这样就使用了64 * 6同时连接,集群停止接受新请求,我的软件停止工作。 我尝试添加以下内容来增加64个连接限制: --be_service_threads = 256 --fe_service_threads = 256 impalad启动脚本,没有任何改变,但执行的持续时间,是可预期的4倍。 为了完成描述,我的代码发送的请求等分为每6个impalad。对于每组请求,它创建一个线程,打开一个新连接,进行计算,然后关闭结果集,语句和连接。该线程在应用程序持续时间内处于活动状态,并且无法解释代码的结构。 这是一个重现错误的例子:
public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
logger.info("Starting");
try{
Connection con = null;
ResultSet rs = null;
Statement stmt = null;
String connectionUrl = "jdbc:impala://<myimpalaserver>:21050/;auth=noSasl;";
String jdbcDriverName = "com.cloudera.impala.jdbc41.Driver";
Class.forName(jdbcDriverName);
logger.info("Tentativo di connessione a " + connectionUrl);
int count = 0;
try{
con = DriverManager.getConnection(connectionUrl);
stmt = con.createStatement();
logger.info("Executing query");
rs = stmt.executeQuery("Select 2");
logger.info("Query terminata");
while (rs.next()) {
++count;
}
} finally {
if (rs != null) try {
logger.info("#output rows: " + count + ". Closing resultset");
rs.close();
} catch (SQLException logOrIgnore){}
if (stmt != null) try {
logger.info("closing statemenet");
stmt.close();
} catch (SQLException logOrIgnore){}
if (con != null) try {
logger.info("closing connection");
logger.info("Connection Status:"+con.isClosed());
con.close();
logger.info("Connection Status:"+con.isClosed());
} catch (SQLException logOrIgnore){}
}
logger.info("sleeping");
Thread.sleep(1000000);
System.out.println("Finishing");
}
catch(Exception e){
e.printStackTrace();
}
}
}
我认为impala制作的hiveserver2连接存在一些问题,但我不确定。正如最佳实践所说,Java代码应该正确包装。 以前有没有人遇到过这个问题或类似的问题?你是怎么解决的?