java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@44f16719 is still active.

当使用SQLOOOP从MySQL导入数据时,可能会遇到由于活动的流结果集未关闭导致的错误。本文详细解析了错误原因,并提供了解决方案,包括确认lib目录包含MySQL驱动包及正确配置--driver参数。

sqoop 导入mysql 表时,出现以下异常:

19/07/28 07:44:44 ERROR manager.SqlManager: Error reading from database: java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@1ea9f6af is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.
java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@1ea9f6af is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
    at com.mysql.jdbc.MysqlIO.checkForOutstandingStreamingData(MysqlIO.java:2622)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1846)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
    at com.mysql.jdbc.ConnectionImpl.getMaxBytesPerChar(ConnectionImpl.java:2931)
    at com.mysql.jdbc.Field.getMaxBytesPerCharacter(Field.java:582)
    at com.mysql.jdbc.ResultSetMetaData.getPrecision(ResultSetMetaData.java:441)
    at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:305)
    at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:260)
    at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:246)
    at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:327)
    at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1872)
    at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1671)
    at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:501)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
19/07/28 07:44:44 ERROR tool.ImportTool: Import failed: java.io.IOException: No columns to generate for ClassWriter
    at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1677)
    at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:501)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
    at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
    at org.apache.sqoop.Sqoop.main(Sqoop.java:252)

解决办法:确定sqoop的lib下有mysql 驱动包。
另外需要添加 --driver 参数,完整脚本:

sqoop import --connect jdbc://mysql/ip:3306/库名 \
--username 用户名 \
--password 密码 \
--table mysql的表名 \
--hive-database hive里的库名 \
--hive-import \
-fields-terminated-by '\t' \
--hive-overwrite \
--hive-table hive里的表名 \
--driver com.mysql.jdbc.Driver
`JDBC rollback failed nested exception is java.sql.SQLException: Protocol violation [0]` 通常表示在执行回滚操作时,JDBC 驱动程序和数据库之间的通信协议出现了问题。以下是一些可能的解决方案: #### 检查 JDBC 驱动版本 确保使用的 JDBC 驱动版本与数据库版本兼容。不兼容的驱动版本可能会导致协议违反异常。可以通过更新 JDBC 驱动到最新的稳定版本来解决这个问题。例如,如果使用的是 MySQL 数据库,可在 Maven 项目的 `pom.xml` 文件中更新 MySQL 驱动依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` #### 检查数据库连接配置 确认数据库连接 URL、用户名和密码是否正确。错误的配置可能会导致通信协议错误。例如,对于 MySQL 数据库,连接 URL 可能如下: ```java String url = "jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC"; String username = "your_username"; String password = "your_password"; Connection connection = DriverManager.getConnection(url, username, password); ``` #### 检查数据库服务器状态 确保数据库服务器正常运行,没有出现网络问题或资源限制。可以尝试重启数据库服务器,检查服务器日志以查看是否有异常信息。 #### 检查事务处理逻辑 确保在代码中正确处理事务。例如,确保在调用 `rollback()` 方法之前,连接处于事务模式。示例代码如下: ```java try { connection.setAutoCommit(false); // 开启事务 // 执行数据库操作 Statement statement = connection.createStatement(); statement.executeUpdate("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')"); // 模拟异常 throw new RuntimeException("Simulated exception"); } catch (SQLException | RuntimeException e) { try { if (connection != null) { connection.rollback(); // 回滚事务 } } catch (SQLException rollbackEx) { rollbackEx.printStackTrace(); } } finally { try { if (connection != null) { connection.setAutoCommit(true); // 恢复自动提交模式 connection.close(); } } catch (SQLException closeEx) { closeEx.printStackTrace(); } } ``` #### 检查并发访问问题 如果多个线程同时访问同一个数据库连接,可能会导致协议违反异常。确保在多线程环境中正确管理数据库连接,例如使用连接池。以下是使用 HikariCP 连接池的示例配置: ```java import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC"); config.setUsername("your_username"); config.setPassword("your_password"); config.setMaximumPoolSize(10); // 设置最大连接数 HikariDataSource dataSource = new HikariDataSource(config); Connection connection = dataSource.getConnection(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值