java.sql.SQLException: java.lang.RuntimeException: serious problem

本文讲述了使用Spark on Hive,通过SparkSQL查询Hive的ORC表时出现报错的情况。文中先给出了报错信息,尝试了几种解决方案均失败或不符合需求,最终通过在hive的配置文件hive - site.xml增加特定配置并覆盖或修改spark配置目录下的该文件,重启hive和spark后成功执行SQL。

场景: spark on hive 使用sparksql查询hive的ORC表。

select * from  evchk_ods.ODS_CAR_DRIVE_INFO_P_D

报错如下:

java.sql.SQLException: java.lang.RuntimeException: serious problem
    at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:279)
    at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:375)
    at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.executeQuery(AbstractDataSource.java:465)
    at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.executeOneSql(AbstractDataSource.java:386)
    at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.sqlExecute(AbstractDataSource.java:333)
    at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.sqlExecute(AbstractDataSource.java:319)
    at com.xxxxx.xxxxx.web.thread.QueryTask.run(QueryTask.java:91)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

 度娘一下相关资料,解决方案如下三种:

  1. set hive.fetch.task.conversion=none;   (失败)
  2. set hive.exec.orc.split.strategy=BI;    (失败)
  3. set hive.execution.engine=mr;   (成功,但是不符合本意。本来需求就是用sparksql,这里设置了执行引擎为MR

最终解决方案:

在hive的配置文件hive-site.xml增加配置如下:

    <property>
      <name>hive.orc.compute.splits.num.threads</name>
      <value>500</value>
    </property>
然后用修改后的hive-site.xml 重新覆盖spark配置目录下的hive-site.xml文件。

或者直接在spark配置目录下的hive-site.xml中增加上述配置,然后重启hive和spark。

最后成功执行sql,查询数据和插入表。

 

### 原因分析 在 Java 操作 MySQL 数据库时,出现 `java.sql.SQLException: Operation not allowed after ResultSet closed` 异常通常是因为在 `ResultSet` 已经关闭后,仍然尝试对其进行操作。这可能发生在手动关闭 `ResultSet`、`Statement` 或 `Connection` 之后,或者在使用 try-with-resources 自动关闭资源的情况下,试图访问已经被释放的 `ResultSet` 对象 [^3]。 ### 解决方案 为避免此类异常,应在所有数据库操作完成后再关闭 `ResultSet` 和相关资源。例如,在使用 `try-with-resources` 结构时,应确保所有操作都在该结构内部完成,而不是在其外部尝试访问资源 。 以下是一个示例代码,展示了如何正确管理资源并避免在关闭 `ResultSet` 后进行操作: ```java String sql = "SELECT id, name FROM users"; try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); } ``` 在此示例中,`try-with-resources` 确保在代码块结束时自动关闭 `ResultSet`、`PreparedStatement` 和 `Connection`。这样可以避免在外部操作已关闭的 `ResultSet`,从而防止 `java.sql.SQLException: Operation not allowed after ResultSet closed` 异常的发生 [^3]。 此外,如果需要在 `ResultSet` 被关闭后仍然保留数据,可以考虑将数据缓存到集合中,例如 `List` 或 `Map`,以便后续处理 。 ### 异常与资源管理的注意事项 - 在某些情况下,即使 `ResultSet` 未被显式关闭,也可能由于 `Statement` 或 `Connection` 的关闭而被自动关闭。因此,确保在 `ResultSet` 被使用期间,相关的 `Statement` 和 `Connection` 保持打开状态 [^3]。 - 如果使用了连接池(如 HikariCP、C3P0 等),应确保正确释放资源,并遵循连接池的使用规范,以避免资源泄漏或非法访问 。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值