在 MySQL connector/j 中生成了大量 "SHOW FULL COLUMNS FROM ..." 查询

Tons of generated "SHOW FULL COLUMNS FROM ..." queries in MySQL connector/j

我将 Spring-jdbc NamedParameterJdbcTemplate 与 mysql-connector-j 一起使用,我收到了大量的 "extra" SQL几乎所有的语句都看起来像 "SHOW FULL COLUMNS FROM ...".

这是一段 MySQL 日志,其中显示了我的查询以及许多我没有发出的查询:

Query     SELECT p.*, t.textdata descr, ... from parts p, string t where .....
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`parts`
Query     SHOW FULL COLUMNS FROM `mydb`.`strings`
Query     SHOW FULL COLUMNS FROM `mydb`.`strings`

为什么会发生这种情况,我该如何阻止它?

经过一些调查,问题似乎是由 mysql 连接器中 Field.getCollation() 的执行不当引起的,该连接器从 ResultSetMetaData.isCaseSensitive() 调用,而 CachedRowSet 又调用该连接器] 被 Spring jdbc.

使用

幸运的是,有一个快速的解决方法是将 useDynamicCharsetInfo 设置为 false 例如:

jdbc:mysql://localhost/mydb?useDynamicCharsetInfo=false

=== 编辑 2015 年 12 月 ===

在放弃 GPL 许可的 MySQL-连接器转而使用 LGPL 许可的 MariaDB-connector 后,此问题不再存在。