开发者社区> 问答> 正文

查询一百万数据的时候,executeQuery的时候报数组下标越界,是要配置什么参数,是因为并发执行

[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

展开
收起
山海行 2023-07-05 19:26:36 63 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    报数组下标越界很可能是Druid配置问题导致的。

    主要有以下几种可能:

    连接池大小不足
    查询100万条数据需要占用较多资源,如果连接池中连接数量不足,就会出现下标越界错误。

    可以增加maxActive和initialSize配置,给足足够的连接。

    超时时间设置不当
    如果查询时间超过了connectionTimeout或maxWait设置,也会导致获取不到可用连接。

    需要合理调整超时时间,让SQL查询有足够的时间执行。

    高并发下产生ANN unlikely 异常
    部分Druid版本在高并发下,有可能触发ArrayIndexOutOfBoundsException。

    建议升级到较新版本修复此Bug。

    使用关闭了连接池的datasource
    如果数据源在执行前已关闭连接池,必然会报下标越界错误。

    Druid 具有flaky 的行为
    部分Druid版本存在不稳定行为,可能会随机产生下标越界异常。

    建议将版本升级到最新。

    总的来说,查询100万条数据报下标越界,主要可能是:

    连接池大小不足
    超时设置不当
    高并发下Druidbug
    数据源关闭
    Druid版本存在flaky行为
    想要解决这个问题,需要:

    增加连接池大小
    调整超时时间
    升级 Druid 版本修复Bug
    确保数据源在执行前仍然可用

    2023-07-30 17:03:07
    赞同 展开评论 打赏
  • 问题出现在executeQuery方法调用时,抛出了异常。这通常表示在结果集解析过程中出现了数组下标越界的情况。

    根据错误堆栈信息来看,异常发生在com.mysql.jdbc.Buffer.readLongLong方法中,而且涉及到结果集的解析过程。这可能与你使用的MySQL数据库驱动程序或数据库连接池有关。

    2023-07-11 09:09:27
    赞同 展开评论 打赏
  • 升级mysql驱动试试看

    原回答者GitHub用户wenshao

    2023-07-06 10:55:30
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载