自定义连接池将mysql和spark-streaming进行集成,连接池JDBCWrapper类中的doQuery()方法如下:
public ResultSet doQuery(String sqlText) { Connection conn = getConnection(); PreparedStatement preparedStatement = null; //Boolean bool = null; ResultSet rs = null; try { preparedStatement = conn.prepareStatement(sqlText); rs = preparedStatement.executeQuery(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (preparedStatement != null) { try { //关闭preparedStatement的同时也关闭了resultSet preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { connectionPool.put(conn); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return rs; }
然后在spark-streaming中调用,并将查询结果打印出来:
ResultSet rs = jdbcWrapper.doQuery("select * from region_count"); while (rs.next()) { String region = rs.getString(1); int count = rs.getInt(2); System.out.println(region+","+count); }
此时运行就会报错java.sql.SQLException: ResultSet is closed
因为在doQuery()方法中,PreparedStatment关闭后就把 ResultSet也关了,所以doQuery()方法不应该返回ResultSet,修改后如下:
public void doQuery(String sqlText) { Connection conn = getConnection(); PreparedStatement preparedStatement = null; //Boolean bool = null; ResultSet rs = null; try { preparedStatement = conn.prepareStatement(sqlText); rs = preparedStatement.executeQuery(); while (rs.next()) { String region = rs.getString(1); int count = rs.getInt(2); System.out.println(region+","+count); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (preparedStatement != null) { try { //关闭preparedStatement的同时也关闭了resultSet preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { connectionPool.put(conn); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }在spark-streaming中只需要调用 jdbcWrapper .doQuery( "select * from region_count" );即可。