[ERROR] 2020-03-18 14:32:17.906 - [taskAppId=TASK-1266-145730-18939]:[368] - java.lang.ArrayIndexOutOfBoundsException: 5 java.sql.SQLException: java.lang.ArrayIndexOutOfBoundsException: 5 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:810) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2020) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) at org.apache.dolphinscheduler.server.worker.task.sql.SqlTaskFetchMode.fetchData(SqlTaskFetchMode.java:49) at org.apache.dolphinscheduler.server.worker.task.sql.SqlTaskFetchMode.process(SqlTaskFetchMode.java:39) at org.apache.dolphinscheduler.server.worker.task.sql.SqlTask.executeFuncAndSql(SqlTask.java:356) at org.apache.dolphinscheduler.server.worker.task.sql.SqlTask.handle(SqlTask.java:193) at org.apache.dolphinscheduler.server.worker.runner.TaskScheduleThread.run(TaskScheduleThread.java:158) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ArrayIndexOutOfBoundsException: 5 at com.mysql.jdbc.Buffer.readLongLong(Buffer.java:370) at com.mysql.jdbc.Buffer.readFieldLength(Buffer.java:298) at com.mysql.jdbc.Buffer.fastSkipLenString(Buffer.java:164) at com.mysql.jdbc.MysqlIO.unpackField(MysqlIO.java:657) at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:412) at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3070) at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2338) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1337) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:787) ... 12 common frames omitted
原提问者GitHub用户nikexu
报数组下标越界很可能是Druid配置问题导致的。
主要有以下几种可能:
连接池大小不足
查询100万条数据需要占用较多资源,如果连接池中连接数量不足,就会出现下标越界错误。
可以增加maxActive和initialSize配置,给足足够的连接。
超时时间设置不当
如果查询时间超过了connectionTimeout或maxWait设置,也会导致获取不到可用连接。
需要合理调整超时时间,让SQL查询有足够的时间执行。
高并发下产生ANN unlikely 异常
部分Druid版本在高并发下,有可能触发ArrayIndexOutOfBoundsException。
建议升级到较新版本修复此Bug。
使用关闭了连接池的datasource
如果数据源在执行前已关闭连接池,必然会报下标越界错误。
Druid 具有flaky 的行为
部分Druid版本存在不稳定行为,可能会随机产生下标越界异常。
建议将版本升级到最新。
总的来说,查询100万条数据报下标越界,主要可能是:
连接池大小不足
超时设置不当
高并发下Druidbug
数据源关闭
Druid版本存在flaky行为
想要解决这个问题,需要:
增加连接池大小
调整超时时间
升级 Druid 版本修复Bug
确保数据源在执行前仍然可用
问题出现在executeQuery方法调用时,抛出了异常。这通常表示在结果集解析过程中出现了数组下标越界的情况。
根据错误堆栈信息来看,异常发生在com.mysql.jdbc.Buffer.readLongLong方法中,而且涉及到结果集的解析过程。这可能与你使用的MySQL数据库驱动程序或数据库连接池有关。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。