我目前正在学习更多关于在Spring Boot webapp中实现JDBC和使用数据库的知识,我遇到了本文底部写的以下堆栈跟踪.

我创建了一个简单的Employee模型,并试图在main()所在的同一个类上执行一些数据库代码.模型和主类是整个项目中仅有的两个java文件.我试图实现以下run()代码,该代码覆盖了接口CommandLineRunner中的代码,但我没有得到log.info("Part A:")之后的日志(log):

log.info("Part A:")
employees.forEach(employee -> {log.info(employee.toString());
        log.info("part a");});

--我注意到:

我注意到,在堆栈跟踪开始之前,日志(log)的最后一行来自:"Thread-1",而不是"main".我认为这意味着,来自主线程以外的其他地方的线程在正常关闭之前遇到了错误并关闭了连接.

此外,我认为,因为HikariPool closed before "peer's close_notify",我认为它指的是HikariPool的正常关闭,我无法看到我一直试图获取的最后一点日志(log)记录.我想看到的最后一点日志(log)记录是已插入我的数据库的员工的日志(log)记录.

我想看到的最后一点日志(log)应该从这行代码中获取:

employees.forEach(employee -> {log.info(employee.toString());
        log.info("part a");});

--注意事项:

由于日志(log)中有这一行,我以为会看到该员工被插入到我的数据库中,但当我直接在MySQL命令行客户端上查询时,它返回了一个空集:

2018-11-03 21:08:35.362  INFO 2408 --- [           main] c.j.jdbctest1.JdbcTest1Application       : rows affected: 1

我不明白为什么.

stacktrace和日志(log):(粘贴在下面的stacktrace实际上会重复几次,但为了简洁起见,我将其切断.)

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 **

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");});

    }
}

为了以防万一,我从应用程序中粘贴了这段代码.属性:

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

推荐答案

为了解决这个问题,我花了大约三天的时间.

(编辑:这是一个测试的变通方法,实际上不是一个解决方案.)

起初,我从try 为mysql配置自己的SSL开始解决这个问题,为此我花了好几个小时.太多的时间过go 了,直到我意识到配置它和Cmake和C++有关,这使我放弃了.这非常令人沮丧.然而,我没有放弃,并试图通过一种尚未找到的方法完全禁用SSL.我最终找到了方法.这是:

  1. 您必须使用MySQL的旧密码.传统密码是MySQL在5.7x版中验证内容的方式.

再次打开MySQL安装程序,重新配置MySQL服务器设置.

The screen that you should get to

在重新配置的最后阶段,您可能会遇到一些错误:

我在最后阶段遇到了问题,我不知道如何修复,所以我完全卸载了MySQL.我使用windows.为了卸载MySQL,我从程序文件中删除了MySQL项目根目录.我还删除了保存在Program Data(C驱动器中的一个隐藏文件夹)中的数据库,因为我想重新开始(警告:这将删除以前保存的所有数据!).从控制面板卸载MySQL可能不足以从计算机上完全删除MySQL.

  1. 删除所有*.pem文件位于C:\ProgramData\MySQL\MySQL Server 8.0\Data中.(或者把它移到别的地方,我就是这么做的)

您可能在C驱动器中看不到程序数据.这是因为它是一个隐藏的文件夹.要查看隐藏文件夹,请执行以下操作:

在控制面板中搜索文件夹选项.

go 查看.

在"高级设置"和"隐藏文件和文件夹"下,单击"显示隐藏文件、文件夹和驱动器"

  1. 转到C:\ProgramData\MySQL\MySQL Server 8.0并打开my.cnf(或my.ini).在[mysqld]后面添加以下行:

ssl=0

然后保存.现在应该可以了.

参考资料:

  1. https://community.atlassian.com/t5/Confluence-questions/MySQL-Public-Key-Retrieval-is-not-allowed/qaq-p/778956
  2. https://scalegrid.io/blog/configuring-and-managing-ssl-on-your-mysql-server/

Mysql相关问答推荐

一次又一次地删除事件行

Mysql:使用like Select 查询

从表中动态删除所有空列

MySQL - 密码哈希没有预期的格式

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

基于关系的每个实体有一个真值和多个假值

检索按键列值分组的最新日期 (MySql)

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

MySql中的可见索引和不可见索引是什么

如何从将分钟、天、月和年存储在不同列中的表中查询数据

如何在 Windows 上访问 xampp 的命令行

如何在不违反唯一约束的情况下交换 MySQL 中两行的值?

试图获取非对象的属性

如何在 MySQL 上一次删除一系列记录?

在 MySQL Workbench EER 图中的多个列上创建唯一约束

如何使用 SQL 数据库中的经纬度查找最近的位置?

将 MySQL 数据库置于版本控制之下?