解决SpringBoot 链接mysql 时出现 0秒后返回数据报错(mysql参数调优,win服务器tcp调优)错误笔记记录

在项目部署之后,每次在第二天早上就出现tomcat种SpringBoot项目链接不上数据库 0秒后返回数据的错误。重启服务器后就能连上了。(老折磨人了,每天白天上课都要看着服务器,希望别死......)历经磨难终于解决了/(ㄒoㄒ)/~~

第一种情况

网络链接问题,比如断网,内外网的情况。

第二种情况 也是网上回答最多的情况

在保证能ping同不是网络问题之后。

可能会是mysql会将连接池中好久没用的连接断开 而连接池不知道连接断开 就出现连接不上mysql数据库 0秒后返回数据连接断开的情况mysql默认时间为8小时 所以经常会出现早上就不好使的情况

在mysql配置文件my.ini中调大这两个属性。

linux和windows服务器的最大参数不一样 这里为linux最大值

wait_timeout=31536000

interactive_timeout=31536000

这里再给一下mysql基本的参数调优 附带解释和所查询的博客

[mysqld]
#table_cache=1024                      
#innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=0
#0 log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
#1 每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
#2 每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
innodb_log_buffer_size=2M  
#这个参数设置 InnoDB 用来往磁盘上的日志文件写操作的缓冲区的大小。这有点像 Oracle 的 log_buffer ,通过内存缓冲来延缓磁盘 I/O 以提高访问的效率。 因为 MySQL 每秒都会将日志缓冲区的内容刷新到日志文件,因此无需设置超过 1 秒所需的内存空间。通常设置为 8 ~ 16MB 就足够了,默认值是 1MB 。
innodb_buffer_pool_size=8GB
# https://blog.csdn.net/weixin_41782053/article/details/87269158 怎么设置最佳内存帖子
# innodb_buffer_pool_size这个参数一般设成物理内存的70%-80%,
innodb_thread_concurrency=8  
#你的服务器CPU有几个就设置为几,建议用默认一般为8
key_buffer_size=128M
# 为了最小化磁盘的 I/O , MyISAM 存储引擎的表使用键高速缓存来缓存索引,这个键高速缓存的大小则通过 key-buffer-size 参数来设置。如果应用系统中使用的表以 MyISAM 存储引擎为主,则应该适当增加该参数的值,以便尽可能的缓存索引,提高访问的速度。
read_buffer_size=4M
# (数据文件存储顺序)是MySQL读入缓冲区的大小,将对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区,read_buffer_size变量控制这一缓冲区的大小,如果对表的顺序扫描非常频繁,并你认为频繁扫描进行的太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能,read_buffer_size变量控制这一提高表的顺序扫描的效率 数据文件顺序。
# https://blog.csdn.net/wei_wenbo/article/details/50817692
read_rnd_buffer_size=16M
# 是MySQL的随机读缓冲区大小,当按任意顺序读取行时(列如按照排序顺序)将分配一个随机读取缓冲区,进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要大量数据可适当的调整该值,但MySQL会为每个客户连接分配该缓冲区所以尽量适当设置该值,以免内存开销过大。表的随机的顺序缓冲 提高读取的效率。
# https://blog.csdn.net/wei_wenbo/article/details/50817692
sort_buffer_size=32M
# 通过虑增加sort_buffer_size 来加速ORDER BY 或者GROUP BY 操作,不能通过查询或者索引优化的。
max_connections=2048
# 它是用来限制用户资源的
# https://blog.csdn.net/bigtree_3721/article/details/73129091
thread_cache_size=120
# :当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)即可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能。
# https://blog.csdn.net/hll814/article/details/50764666
query_cache_size=64M
# MySQL查询缓存保存查询返回的完整结果。当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段。 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效。 但是随着服务器功能的强大,查询缓存也可能成为整个服务器的资源竞争单点。 
# https://blog.csdn.net/u014044812/article/details/78924315
max_allowed_packet = 4M  
thread_stack = 256K   
join_buffer_size = 8M  
tmp_table_size = 256M  

log-error="C:/ProgramData/MySQL/MySQL Server 5.7/log/error.log"
#log="C:/ProgramData/MySQL/MySQL Server 5.7/log/mysql.log"
##long_query_time=3
#log-slow-queries= "C:/ProgramData/MySQL/MySQL Server 5.7/log/slowquery.log" 
#skip-networking  
skip-name-resolve
wait_timeout=31536000  
interactive_timeout=31536000  

第三种情况 windows服务器TCP链接占满了

在第二种改完不好使之后,又开始了胡乱修改开启了数据压缩,优化了mysql的慢查询,配置了nginx + tomcat负载均衡,修改tomcat链接参数,后来给下入多的地方加上锁,然后居然能保证两天左右死一次了(老感动了)便以为是有线程泄露这种情况出现,对数据库产生大量读写或者查询,把连接数占满了,便开始安装监控软件.

通过安装SpringBoot监控  arthas (阿里监控软件)

观测到出现问题时,没有线程泄露和线程死锁,

安装mysql监控 Neor Profile SQL(一个很简单的监控软件有图形化页面)

观测到出现问题时,mysql未出现死锁,连接数不多,mysql没有死掉

然后开始考虑吧mysql和应用服务器哪还能影响链接。忽然想到居然还有tcp链接,老师在网络原理刚讲过。(果然不听课是有代价的)

windows服务器有服务器链接最大值的限制,并且默认超时断连十分的长

所以我们要对windows的TCP链接进行优化 

修改注册表

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

新建 DWORD 类型的注册表项,命名为:MaxUserPort

值数据: 100000(用十进制的格式录入进去,此值的有效范围为5000-65534)

新建 DWORD 类型的注册表项,命名为:TCPTimedWaitDelay

值数据: 30(用十进制的格式录入进去,TIME_WAIT的自动断开时间,默认为4分钟)

十分感谢大佬的帖子救我一命 https://www.cnblogs.com/gode/p/9770831.html

另外要十分仔细的查看报错信息  他在其中出现 No buffer space available 这个关键字。

折磨了我一个月的死亡报错就这么解决了,太感动了。

你可能感兴趣的:(项目笔记感悟,java,spring,spring,boot)