记录:282
场景:几个常见问题:
Java代码执行SQL语句导致线程卡住,不往下执行了。
CLIENT_PUGIN_AUTH is required。
Communications link failure。
java.lang.ClassNotFoundException。
版本:Spring Boot 2.6.3
一、案例场景
1.Java代码执行SQL语句导致线程卡住,不往下执行了
问题:Java线程池的10个线程,并发在Oracle数据库的表T_DEMO的执行UPDATE语句。但是10个线程都卡住了,导致任务堆积了,而且try catch都没有捕获异常。
原因:Oracle数据库的表T_DEMO,在PL/SQL客户端对全表执行了FOR UPDATE锁住表,没有提交。导致Java代码在执行UPDATE语句时,获取不到数据库表操作,一直在等待。且没有抛出异常。
解决:在数据源类中设置超时时间,例如。
DruidDataSource dataSource = new DruidDataSource();
dataSource.setQueryTimeout(60);
现象:超时,会抛出异常。
Caused by: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:630)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:564)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1151)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:771)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:299)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:498)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:152)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1052)
at oracle.jdbc.driver.OracleStatement.executeSQLStatement(OracleStatement.java:1531)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1311)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3746)
at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3918)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3897)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:992)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:255)
at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651)
... 9 more
Caused by: Error : 1013, Position : 0,......
2.报错:CLIENT_PUGIN_AUTH is required
报错:java.sql.SQLNontransientConnectionException: CLIENT_PUGIN_AUTH is required
原因:本例的MySQL数据库版本是5.6.29,而在pom.xml中引入了8.0.23驱动
解决:MySQL驱动降低版本。
2.1 pom.xml变更
高版本:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>>8.0.23</version>
</dependency>
变更为:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
2.2 application.yml变更
MySQL驱动类:
高版本:
com.mysql.cj.jdbc.Driver
变更为:
com.mysql.jdbc.Driver
3.报错:404 Not Found: [no body]
报错:
org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: [no body]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:113)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:168)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:819)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:437)
解决:本例是访问的服务端Controller的方法变了,重新确定服务端访问路径。
4.报错:Communications link failure
报错:
com.mysql.jdbc.exceptions.jdbc4.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.
解决:数据库连接信息不对。
5.报错:ClassNotFoundException
报错:
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpSessionIdListener
原因:
基于Spring Boot 2.6.3的web工程:
在Tomcat 7的servlet-api.java中没有HttpSessionIdListener。
在Tomcat 8的javax.servlet-api-4.0.1.jar中有HttpSessionIdListener。
解决:war包部署环境变更为Tomcat 8。
以上,感谢。
2022年7月4日