Sonarqube 6.1 com.mysql.jdbc.PacketTooBigException:查询包太大

时间:2016-11-23 13:40:55

标签: sonarqube

亲爱的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 Connector Java
  • 驱动程序版本:mysql-connector-java-5.1.39
  • MySQL Varaible“max_allowed_pa​​cket = 16M”(从4M增加)
  • MySQL Varaible“innodb_log_file_size = 128M”(从48M增加)
  • Sonar JDBC连接字符串:“
  • sonar.jdbc.url = JDBC:MySQL的:// DB-URL:3306 /声纳了useUnicode =真安培; *的characterEncoding = UTF8&安培; rewriteBatchedStatements =真安培; 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

3 个答案:

答案 0 :(得分:15)

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

服务器

有关如何在服务器上执行此操作的详细信息,请参阅此处的 Resolution 部分。建议将此值设置为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
  2.   

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

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

      maxAllowedPacket

           

      要发送给服务器的最大允许数据包大小。如果未设置,则为该值   系统变量&#39; max_allowed_pa​​cket&#39;将用于初始化   这在连接时。如果设置得更大,此值将不会生效   而不是&#39; max_allowed_pa​​cket&#39;的价值。另外,由于内部原因   依赖于属性&#34; blobSendChunkSize&#34;,此设置有一个   最小值&#34; 8203&#34; if&#34; useServerPrepStmts&#34;设置为&#34; true&#34;。

           

      默认值:-1

           

      自版本:5.1.8

答案 1 :(得分:4)

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

我能够通过更改客户端jdbc网址配置 - &gt;来实现此功能。将服务器配置保留原样。

请注意,我们必须在这里使用'useServerPrepStmts = true'。

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

检查mysql连接器配置参考here

SO上还有一篇文章详细讨论了客户端的变化 - 检查here

希望这有帮助!

答案 2 :(得分:1)

这是我遇到同样问题时的所作所为,并解决了我的问题。

服务器错误:

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并运行bellow命令。你可以看到如下的当前值。

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';