【问题标题】:Sonarqube 6.1 com.mysql.jdbc.PacketTooBigException: Packet for query is too largeSonarqube 6.1 com.mysql.jdbc.PacketTooBigException:查询数据包太大
【发布时间】:2017-04-07 13:23:36
【问题描述】:

尊敬的 Sonarqube 社区,

自从更新到 Sonarqube 6.1 后,我们在 Sonarqube 中遇到了一个错误,即用于查询的数据包太大。 我们做什么:Jenkins 正在检查 PHP 源代码,然后 SonarQube Scanner 正在分析源代码并与 SonarQube 服务器通信。此过程失败,Jenkins 中的日志输出:

org.sonarqube.ws.client.HttpException: Error 500 on http://URL-TO-SONAR/sonar/api/ce/submit?projectKey=lhind.php.PRJName&projectName=PRJName : {"errors":[{"msg":"Fail to insert data of CE task AViRLtiaB_5m8twj_1J3"}]}

  • Jenkins 版本:2.19.3
  • SonarQube 版本:6.1
  • SonarQube 扫描仪:2.8
  • MySQL 版本:5.6.34
  • 驱动程序:MySQL 连接器 Java
  • 驱动版本:mysql-connector-java-5.1.39
  • MySQL 变量“max_allowed_pa​​cket = 16M”(从 4M 增加)
  • MySQL 变量“innodb_log_file_size = 128M”(从 48M 增加)
  • Sonar JDBC 连接字符串:“
  • sonar.jdbc.url=jdbc:mysql://DB-URL:3306/sonar?useUnicode=true&*characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&maxAllowedPacket=16777216"

我们已经增加了最大数据包大小和 innodb_log_file_size。使用 SonarQube 6.1 的相同数量的代码,我们没有这个问题。

有什么想法吗?

在 SonarQube 中,我们在 sonar.log 文件中发现了以下异常:

2016.11.23 12:35:16 ERROR web[][o.s.s.w.WebServiceEngine] Fail to process request http://SONAR-URL.de:8443/sonar/api/ce/submit?projectKey=lhind.php.PRJName&projectName=PRJName java.lang.IllegalStateException: Fail to insert data of CE task AViRLtiaB_5m8twj_1J3 at org.sonar.db.ce.CeTaskInputDao.insert(CeTaskInputDao.java:56) ~[sonar-db-6.1.jar:na] (deleted because too much text ...) at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] **Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (24313938 > 16777216). You can change this value on the server by setting the max_allowed_packet' variable.** at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3671) ~[mysql-connector-java-5.1.39.jar:5.1.39] (deleted because too much text ...) at org.sonar.db.ce.CeTaskInputDao.insert(CeTaskInputDao.java:53) ~[sonar-db-6.1.jar:na] ... 34 common frames omitted

【问题讨论】:

  • 请将您的代码放入代码块中。无法阅读此内容。

标签: sonarqube


【解决方案1】:

在客户端和服务器上增加 MySQL 中允许的最大数据包大小以解决此问题。

服务器

有关如何在服务器上执行此操作的详细信息,请参阅此处的解决方案部分。建议将此值设置为 256MB。在上面的堆栈跟踪中,数据包大小约为 24MB。

https://confluence.atlassian.com/confkb/exceeds-max-allowed-packet-for-mysql-179443425.html

我喜欢上面的链接,因为它描述了如何在不停止数据库的情况下增加值,如果这对您很重要的话。

客户

在客户端,增加 SonarQube JDBC URL 中maxAllowedPacket 参数的值。

参考

有关更多详细信息,请参阅 MySQL 文档中的以下链接。

  1. http://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html

客户端和服务器都有自己的 max_allowed_pa​​cket 变量,所以如果你想处理大数据包,你必须增加这个 客户端和服务器中的变量。

  1. https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html

最大允许数据包

允许发送到服务器的最大数据包大小。如果未设置,则值 系统变量“max_allowed_pa​​cket”将用于初始化 这在连接。该值设置大则不生效 比“max_allowed_pa​​cket”的值。此外,由于内部 具有属性“blobSendChunkSize”的依赖项,此设置具有 如果“useServerPrepStmts”设置为“true”,则最小值为“8203”。

默认值:-1

自版本:5.1.8

【讨论】:

  • 感谢您的回答。我想知道为什么只有在从 SonarQube 6.0 更新到 SonarQube 6.1 之后才需要进行此更改。这就是为什么我希望找到另一个答案。分析项目的报告大小大于 75 MB,压缩文件为 22 MB。重要的是 zip 大小还是正常的报告大小?
  • 我做了以下来解决问题,希望未来几年:首先,更改 mysql db 的全局变量:“maxAllowedPacket=268435456”和“innodb_log_file_size=536870912”(注意:增加日志文件大小意味着,你需要在你的 mysql 数据库开始时的可用磁盘空间,乘以 2(标准配置)。所以将创建 2 个文件)。不要忘记更改 jdbc 连接字符串并为 maxAllowedPacket 添加参数!
【解决方案2】:

我遇到了同样的问题,但是我们有一个限制,即 我们无法更改 MySQL 服务器配置 (max_allowed_pa​​cket)

我可以通过更改 客户端 jdbc URL 配置 -> 保持服务器配置不变。

请注意,我们必须在此处使用“useServerPrepStmts=true”。

jdbc:mysql://[dbhost]:[dbport]?useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf8&useServerPrepStmts=true&maxAllowedPacket=20000000&useSSL=false

检查mysql连接器配置参考here

还有一篇关于 SO 的帖子详细讨论了客户端更改 - 检查 here

希望这会有所帮助!

【讨论】:

  • 我在/conf/vim sonar.properties中找到了上面的jdbc-URL配置。编辑此内容后,从 Sonar-Webgui 重新启动不需要参数,它必须通过调用停止和启动:/bin/linux-x86-6/sonar.sh stop 和 .../sonar。开始
【解决方案3】:

当我遇到同样的问题并解决了我的问题时,我就是这样做的。

服务器错误:

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4237058 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.

首先检查这个以了解当前值:

通过终端登录到您的 mysql 并运行以下命令。您可以看到如下所示的当前值。

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
1 row in set (0.00 sec)

max_allowed_packet 值设置为类似这样。目的是根据您的要求增加价值。

mysql> SET GLOBAL max_allowed_packet=512000000;

再次运行以下命令以查看更新后的值。您必须退出 mysql(通过exit; 命令或单击 CLI 的关闭按钮)并重新登录。

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

【讨论】:

  • 像宝石一样工作!
猜你喜欢
  • 2017-06-10
  • 2015-10-10
  • 2016-05-06
  • 1970-01-01
  • 2012-04-25
  • 2012-03-16
  • 1970-01-01
  • 2016-05-14
  • 2012-07-04
相关资源
最近更新 更多