spring boot:jdbc javax.net.ssl.sslexception:在接收到对等方的关闭通知之前关闭入站

vlf7wbxs  于 2021-06-18  发布在  Mysql
关注(0)|答案(9)|浏览(437)

我目前正在学习更多关于在springbootwebapp中实现jdbc和使用数据库的知识,我遇到了本文底部编写的以下堆栈跟踪。
我创建了一个简单的employee模型,并尝试在main()所在的同一个类上执行一些数据库代码。模型和主类是整个项目中仅有的两个java文件。我正在尝试实现以下run()代码,该代码重写接口commandlinerunner中的代码,但是我没有得到应该在log.info(“a部分:”)之后的日志:

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

--我注意到:
我注意到,在堆栈跟踪开始之前,日志的最后一行来自:“thread-1”而不是“main”。我认为这意味着一个线程在正常关闭之前遇到了一个错误并关闭了连接。
另外,我认为由于Hikaripole在“peer's close\u notify”之前关闭,我认为这是指Hikaripole的正常关闭,所以我无法看到我一直试图获取的最后一点日志记录。我想看到的最后一点日志记录是已插入到我的数据库中的员工的日志记录。
我想看到的最后一点日志应该从这行代码中获取:

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

--注意事项:
由于日志中有这一行,我本以为会看到雇员被插入到我的数据库中,但当我直接在mysql命令行客户端上查询时,它返回了一个空集:

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

我不明白为什么一行在数据库中没有插入任何内容时会受到影响。
stacktrace和日志:(下面粘贴的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");});

    }
}

为了以防万一,我从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
z4iuyo4d

z4iuyo4d1#

到数据库的ssl连接失败,请尝试将数据源url更改为:

spring.datasource.url=jdbc:mysql://localhost:3306/employee_database?useSSL=false
qhhrdooz

qhhrdooz2#

警告看起来像是启用了java 11和ssl的mysql驱动程序错误:https://bugs.mysql.com/bug.php?id=93590
由于驱动程序警告而停用加密是个坏主意。
您的插入问题看起来更像是一个典型的事务问题,但我怀疑它与ssl警告有关。

jslywgbw

jslywgbw3#

尝试使用以下url。正如他们建议使用usessl=false一样,确保在url中定义了多个属性时使用<&amp>,而不仅仅是&。
jdbc:mysql://localhost:3306/testdb?servertimezone=pst&usessl=假

zengzsys

zengzsys4#

我遇到了这个问题,决定使用信鸽协议的解决方案,直到我意外地将tomcat从9.0.12版本更新到9.0.16版本,才解决了这个问题。

ggazkfy8

ggazkfy85#

我也面临同样的问题。如果你看一下stacktrace,它清楚地提到了该怎么做-

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.

因此,在通过更改数据源url禁用ssl后,解决了问题-

spring.datasource.url=jdbc:mysql://localhost:3306/security?useSSL=false
dz6r00yl

dz6r00yl6#

当我将服务器中的java版本从8升级到11时,我也遇到了类似的问题。
SpringBoot从2.1及更高版本开始支持Java11。因此,确保项目的依赖关系也相应地更新。这与这个答案有关,因为springboot还影响mysql连接器、hibernate核心和其他依赖项。
无法连接到db导致了更多的noclassdeffounderrors。所以,在研究其他错误之前,一定要先解决这个问题。
springbootstarter的pom依赖性示例

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.12.RELEASE</version>
    <relativePath />
</parent>

希望这对别人有帮助。

cu6pst1q

cu6pst1q7#

我的类似问题在spark中,我通过将java版本从“openjdk版本”1.8.0\U 275“降到”openjdk版本“1.8.0\U 265”来解决,希望对您有用

ecr0jaav

ecr0jaav8#

我也面临同样的问题
但是后来我将mysql connector java版本从5.1.46更新到8.0.20,并且 com.mysql.jdbc.Drivercom.mysql.cj.jdbc.Driver 它解决了我的问题

g6ll5ycj

g6ll5ycj9#

为了解决这个问题,我花了大约三天时间。
(编辑:这是一个测试的解决方案,实际上不是一个解决方案。)
一开始,我从尝试为mysql配置自己的ssl开始解决这个问题,为此我花了不少时间。太多的时间过去了,直到我意识到配置它与cmake和c++有关,这让我放弃了。这很令人沮丧。然而,我没有放弃,并试图通过一个尚未找到的方法完全禁用ssl。我最终找到了方法。在这里:
您必须使用mysql的旧密码。传统密码是mysql在5.7x版中验证东西的方式。
再次打开mysql安装程序,重新配置mysql服务器设置。当你到达那里,你会看到这个屏幕:
你应该到达的屏幕
当到达重新配置的最后阶段时,可能会出现一些错误:
我在最后阶段遇到了问题,我不知道如何修复,所以我卸载了mysql。我用Windows。我从程序文件中删除了mysql项目根目录以卸载mysql。我还删除了保存在ProgramData(c驱动器中的一个隐藏文件夹)中的数据库,因为我想重新开始(警告:这将删除以前保存的所有数据!)。从控制面板卸载mysql可能不足以从计算机中完全删除mysql。
删除c:\programdata\mysql\mysql server 8.0\data中的所有*.pem文件(或者把它移到别的地方,我就是这么做的)
您可能在c驱动器中看不到programdata。这是因为它是一个隐藏的文件夹。要查看隐藏文件夹:
在控制面板中搜索文件夹选项。
转到查看。
在“高级设置”和“隐藏文件和文件夹”下,单击“显示隐藏文件、文件夹和驱动器”
转到c:\programdata\mysql\mysql server 8.0并打开my.cnf(或my.ini)。在[mysqld]后面添加以下行:
ssl=0
然后保存。现在应该可以了。
参考文献:
https://community.atlassian.com/t5/confluence-questions/mysql-public-key-retrieval-is-not-allowed/qaq-p/778956
https://scalegrid.io/blog/configuring-and-managing-ssl-on-your-mysql-server/

相关问题