Dup*_*ark 18 mysql spring-jdbc jdbctemplate sslexception spring-boot
我目前正在学习更多关于在Spring Boot webapp中实现JDBC和使用数据库的知识,我在帖子的底部遇到了以下Stack Trace.
我创建了一个简单的Employee模型,我试图在我的main()所在的同一个类上执行一些数据库代码.模型和主类是整个项目中存在的唯一两个java文件.我正在尝试实现以下run()代码,该代码覆盖了接口CommandLineRunner中的那个,但是我没有得到log.info之后的日志("A部分:"):
log.info("Part A:")
employees.forEach(employee -> {log.info(employee.toString());
log.info("part a");});
Run Code Online (Sandbox Code Playgroud)
- 我注意到了:
我注意到堆栈跟踪开始之前的日志的最后一行来自:"Thread-1"而不是"main".我认为这意味着来自除main之外的某个地方的线程在正常关闭之前遇到错误和关闭连接.
另外,我认为因为HikariPool在"peer's close_notify"之前关闭,我认为它指的是HikariPool的正常关闭,我无法看到我一直试图获取的最后一点日志记录.我希望看到的最后一点日志记录是已插入到我的数据库中的员工的日志记录.
我希望看到的最后一点日志记录应该从这行代码中获得:
employees.forEach(employee -> {log.info(employee.toString());
log.info("part a");});
Run Code Online (Sandbox Code Playgroud)
- 要注意的事项:
由于日志中的这一行,我以为我会看到员工插入到我的数据库中,但当我直接在MySQL命令行客户端上查询时,它返回一个空集:
2018-11-03 21:08:35.362 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : rows affected: 1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在没有任何内容插入数据库时,行会受到影响.
堆栈跟踪和日志:(下面粘贴的堆栈跟踪实际上会重复几次,但我为了简洁而将其剪掉了.)
2018-11-03 21:08:32.997 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Starting JdbcTest1Application on KitKat with PID 2408 (C:\Users\Nano\Downloads\jdbc-test1\jdbc-test1\target\classes started by Nano in C:\Users\Nano\Downloads\jdbc-test1\jdbc-test1)
2018-11-03 21:08:33.003 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : No active profile set, falling back to default profiles: default
2018-11-03 21:08:33.770 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Started JdbcTest1Application in 1.024 seconds (JVM running for 1.778)
2018-11-03 21:08:33.770 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Creating tables
2018-11-03 21:08:33.770 INFO 2408 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2018-11-03 21:08:34.082 INFO 2408 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2018-11-03 21:08:35.135 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Inserting Baggins Hopkins
2018-11-03 21:08:35.362 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : rows affected: 1
2018-11-03 21:08:35.362 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Querying for employee
2018-11-03 21:08:36.065 INFO 2408 --- [ main] c.j.jdbctest1.JdbcTest1Application : Part A:
2018-11-03 21:08:36.065 INFO 2408 --- [ Thread-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
Sat Nov 03 21:08:36 KST 2018 WARN: Caught while disconnecting...
EXCEPTION STACK TRACE:
** BEGIN NESTED EXCEPTION **
javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify
STACKTRACE:
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
at com.mysql.cj.protocol.a.NativeProtocol.quit(NativeProtocol.java:1312)
at com.mysql.cj.NativeSession.quit(NativeSession.java:182)
at com.mysql.cj.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:1750)
at com.mysql.cj.jdbc.ConnectionImpl.close(ConnectionImpl.java:720)
at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:135)
at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1(HikariPool.java:441)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
** END NESTED EXCEPTION **
Run Code Online (Sandbox Code Playgroud)
Java代码:
@SpringBootApplication
public class JdbcTest1Application implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(JdbcTest1Application.class);
@Autowired
JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
SpringApplication.run(JdbcTest1Application.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("Creating tables");
jdbcTemplate.execute("DROP TABLE IF EXISTS employees");
jdbcTemplate.execute("CREATE TABLE employees (emp_id int, name varchar(100), role varchar(100), status varchar(100))");
log.info("Inserting Baggins Hopkins");
int rowsAffected = jdbcTemplate.update("INSERT INTO EMPLOYEE(EMP_ID, NAME, ROLE, STATUS)"
+ " VALUES(1,'Baggins Hopkins','thief','WORKING')");
log.info("rows affected: "+ Integer.toString(rowsAffected));
log.info("Querying for employee");
String sql = "SELECT emp_id,name,role,status FROM employees";
List<Employee> employees = jdbcTemplate.query(sql,(rs, rowNum)->
new Employee(rs.getInt("emp_id"), rs.getString("name"),
rs.getString("role"),Status.valueOf(rs.getString("status"))));
log.info("Part A:");
employees.forEach(employee -> {log.info(employee.toString());
log.info("part a");});
}
}
Run Code Online (Sandbox Code Playgroud)
另外,如果这很重要,我从application.properties粘贴了这段代码:
spring.datasource.url=jdbc:mysql://localhost:3306/employee_database
spring.datasource.username=employee
spring.datasource.password=employee
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)
小智 41
与数据库的SSL连接失败,请尝试将数据源URL更改为:
spring.datasource.url=jdbc:mysql://localhost:3306/employee_database?useSSL=false
Run Code Online (Sandbox Code Playgroud)
小智 14
这对我有用
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.20</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我也面临同样的问题。如果您查看堆栈跟踪,很明显提到要做什么-
Sat Mar 16 09:00:01 IST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'.
You need either to explicitly disable SSL by setting **useSSL=false**, or set **useSSL=true** and provide truststore for server certificate verification.
Run Code Online (Sandbox Code Playgroud)
因此通过更改数据源 url 禁用 ssl 解决了问题-
spring.datasource.url=jdbc:mysql://localhost:3306/security?useSSL=false
Run Code Online (Sandbox Code Playgroud)
该警告看起来像是启用了Java 11和SSL的MySQL驱动程序错误:https : //bugs.mysql.com/bug.php?
id = 93590由于驱动程序警告而停用加密是一个坏主意。
但是,您的插入问题看起来更像是经典的事务问题,我怀疑它与SSL警告有关。
为了解决这个问题,我花了大约三天的时间。
(编辑:这是一种用于测试的解决方法,而不是实际的解决方案。)
起初,我从尝试为 mysql 配置我自己的 SSL 开始解决问题,为此我花了好几个小时。过了太多时间,直到我意识到配置它与 Cmake 和 C++ 有关,这让我放弃了。这非常令人沮丧。但是我并没有放弃并尝试通过一种尚未找到的方法完全禁用 SSL。我最终确实找到了方法。这里是:
再次打开 MySQL 安装程序,并重新配置 MySQL 服务器设置。当你到达那里时,你会看到这个屏幕:
到达重新配置的最后阶段时,您可能会遇到一些错误:
我在最后阶段遇到了问题,我不知道如何解决,所以我完全卸载了 MySQL。我用窗户。我从 Program Files 中删除了 MySQL 项目根目录以卸载 MySQL。我还删除了保存在 Program Data(C 驱动器中的隐藏文件夹)中的数据库,因为我想重新开始(警告:这将删除您以前保存的所有数据!)。从控制面板卸载 MySQL 可能不足以从您的计算机中完全删除 MySQL。
您可能在 C 驱动器中看不到 ProgramData。那是因为它是一个隐藏文件夹。要查看隐藏文件夹:
在控制面板中搜索文件夹选项。
去查看。
在“高级设置”下的“隐藏文件和文件夹”下,单击“显示隐藏的文件、文件夹和驱动器”。
ssl=0
然后保存。它现在应该可以工作了。
参考:
小智 6
我在 Tomcat 尝试通过 ssl 连接到 Aurora mysql (AWS) 时遇到类似问题
我通过将驱动程序版本从“mysql-connector-java-5.1.40.jar”更新为“mysql-connector-java-5.1.49.jar”,并将根 CA 安装到 ceacerts 中解决了该问题:
keytool -import -trustcacerts -file rds-ca-2019-root.pem -keystore /<your_java_home>/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)
希望对你有用
尝试使用以下 URL。正如他们建议使用 useSSL=false 另外,当您在 URL 中定义了多个属性时,请确保使用 <&> 而不是仅使用 & 。
jdbc:mysql://localhost:3306/TestDB?serverTimezone=PST& ;useSSL=假
| 归档时间: |
|
| 查看次数: |
20302 次 |
| 最近记录: |