closing inbound before receiving peer's close_notify

错误详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

java之5分钟插入千万条数据

虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢。10分钟内基本能看到结果。

之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据。

线程池数据插入核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ExecutorService executorService = Executors.newFixedThreadPool(1000000);
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 150000; i++) {
TestUser user = new TestUser();
user.setName(RandomUtil.randomString(20));
userDao.insert(user);
System.out.println("插入数据:" + i);
}

System.out.println(Thread.currentThread().getName() + "正在执行任务");

}
});

应用场景:
造测试数据,如千万甚至亿万级别的数据自动快速生成。

Java8之合并list并去重

核心代码如下:

1
2
List<String> result = Stream.of(Lists.newArrayList("A", "B", "C"), Lists.newArrayList("A", "B"))
.flatMap(Collection::stream).distinct().collect(Collectors.toList());

最终的结果输出是A B C。

应用场景:
有些时候我们需要合并两个返回类型相同的结果集,就可以用这个,不必SQL查询合并结果。

前端代码规范

这是我上家教育saas公司前端同事整理出来的(当时我们公司主要用的前端框架是React),当时我在这家公司除了主写后端之外,还需要写一些前端代码,按照这个规范写,前端代码可读性、可维护性、可扩展性以及性能都会大大提高。