springboot2.5 使用jdbctemplate update insert 报错

【 TiDB 使用环境】生产环境
【 TiDB 版本】8.0.11-TiDB-v7.5.1
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
springboot2.5 使用jdbctemplate 在mysql 人大金仓 海量等数据库的时候没有问题
但是在TIDB数据库下报错



ceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:175) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) [HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) [HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) [HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-4.0.3.jar:na]
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) [spring-jdbc-5.3.9.jar:5.3.9]
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) [spring-jdbc-5.3.9.jar:5.3.9]
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) [spring-jdbc-5.3.9.jar:5.3.9]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:646) [spring-jdbc-5.3.9.jar:5.3.9]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:991) [spring-jdbc-5.3.9.
导致没有办法启动程序

看了下 你的场景,可以试试 这个

TiDB-JDBC 是基于 MySQL 8.0.29 的定制版本。TiDB-JDBC 基于 MySQL 官方 8.0.29 版本编译,修复了原 JDBC 在 prepare 模式下多参数、多字段 EOF 的错误,并新增 TiCDC snapshot 自动维护和 SM3 认证插件等功能。

官方提供的连接驱动
https://docs.pingcap.com/zh/tidb/stable/dev-guide-choose-driver-or-orm#java-drivers

不太了解 使用MySQL-JDBC jdbctemplate ,我看都是pom.xml

mysql
mysql-connector-java
8.0.33

其他都没有改,不可以吗 ?是还要改动那块?第一次使用 有些不太了解怎么处理了|
插入sql
public int insertSql(String sql,Object values){
final String addSql=sql;
final Object sqlParam=values;
KeyHolder key = new GeneratedKeyHolder();
PreparedStatementCreator psc = new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
PreparedStatement ps = con.prepareStatement(addSql,new String{“id”});
if(sqlParam!=null){
for(int i=0;i<sqlParam.length;i++){
ps.setObject(i+1, sqlParam[i]);
}
}
return ps;
}
};
return jdbcTemplate.update(psc,key);
}

到这里就会报错,把sql拿下来直接在数据库中可以执行

换个jar包试试呢

io.github.lastincisor
mysql-connector-java
8.0.29-tidb-1.0.0

看着是连接驱动的问题

但是这个好像不维护了?

有源码,可以自己改了… :see_no_evil:

换电脑测试可以,我电脑这边不可以。代码数据库链接没有问题 。可能我的环境有问题

如果 n milliseconds ago 中的 n 如果是 0 或很小的值,则通常是执行的 SQL 导致 TiDB 异常退出引起的报错,推荐查看 TiDB stderr 日志

https://docs.pingcap.com/zh/tidb/stable/java-app-best-practices#探活配置

文档上也提过这个问题。翻翻tidb日志看看是否能找到一些有帮助的内容。

这里我给tidb提一点建议,一般大公司对数据库驱动都有严格的介质管理,不是你说换驱动就换。
所以,通过换驱动来解决问题是一个方法,但是不是好的实践。
如果想生意做大,我建议还是作为bug fix来修复。

1 个赞

好建议,是有实践经验的👍🏻