Impala JDBC连接在Java MultithreadCode中未正确关闭

时间:2015-03-18 16:04:07

标签: java multithreading jdbc impala

我有一些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代码应该正确包装。 以前有没有人遇到过这个问题或类似的问题?你是怎么解决的?

0 个答案:

没有答案