解决centos下tomcat启动太慢 & JDBC连接oracle太慢的问题
近期遇到一个非常奇怪的问题,也不知道改了什么,tomcat启动非常慢,以前几秒就启动好了,现在要30秒左右。
而且,通过jdbc连接oracle数据库也非常慢,以前建立一个连接只要几十毫秒,现在也要10秒左右。
折腾了好几天,终于解决了,记录下来,帮助大家少走弯路。
遇到这个问题时,最初以为是random策略问题,以前遇到过,通过修改随机数策略可以解决,参照我的这篇文章:
https://www.cnblogs.com/lavezhang/p/6106356.html
但是,修改后发现问题没有解决,只能继续排查。
怀疑是jdk自动寻找proxy的问题,于是设置ProxySelector.setDefault(null),还是没有解决。
怀疑是tomcat版本问题,从tomat8到tomcat8.5,到tomcat9,都试了一遍,还是没解决。
怀疑是jdk的问题,从openjdk换成了oraclejdk,还是没解决。
最后,这种疑难问题,还是依赖Tomcat堆栈数据来分析。
于是导出tomcat堆栈信息
> pgrep java
> 21257
> jstack 21257 > thread_data1
注意:默认通过yum安装的是openjdk,没有jstack这个工具,得安装特殊的包才有,办法去网上搜吧。
最简单的办法是,直接换成oracle jdk,因为openjdk的jstack工具有坑!
开始分析堆栈数据,发现tomcat启动,以及Oracle连接,都是卡在一个地方:
"main" #1 prio=5 os_prio=0 tid=0x00007f812000a000 nid=0x5813 runnable [0x00007f8126dee000]
java.lang.Thread.State: RUNNABLE
at java.net.Inet4AddressImpl.getLocalHostName(Native Method)
at java.net.InetAddress.getLocalHost(InetAddress.java:1474)
at sun.management.VMManagementImpl.getVmId(VMManagementImpl.java:140)
at sun.management.RuntimeImpl.getName(RuntimeImpl.java:59)
at org.springframework.boot.system.ApplicationPid.getPid(ApplicationPid.java:55)
at org.springframework.boot.system.ApplicationPid.<init>(ApplicationPid.java:46)
------------------------------------------------------------------------------------------
"http-nio-8082-exec-4" #23 daemon prio=5 os_prio=0 tid=0x00007fa7fc77a800 nid=0x5438 runnable [0x00007fa7b97d1000]
java.lang.Thread.State: RUNNABLE
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getLocalHost(InetAddress.java:1500)
- locked <0x0000000688fca748> (a java.lang.Object)
at oracle.jdbc.driver.T4CTTIoauthenticate.setSessionFields(T4CTTIoauthenticate.java:1118)
at oracle.jdbc.driver.T4CTTIoauthenticate.<init>(T4CTTIoauthenticate.java:265)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:579)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
查了一下,这行代码是检索/etc/hosts文件,获取当前机器名对应的IP地址,如果没有明确配置机器名和IP的映射关系,就会在这里卡10秒左右,其实就是在局域网内去ping了。
打开/etc/hosts,果然没有配置,赶紧补上,如下:
> vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 prd_web1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 prd_web1
其中,prd_web1就是手工设置的机器名。
至此,问题得以解决!
总结,走了很大一段弯路,其实对于这种程序卡死的现象,最佳解决方案就是分析tomcat堆栈,其它办法都是靠猜测,不靠谱。
另外,这个现象并不是在所有机器上都存在,在有些机器上,即使没有在hosts文件中配置自定义hostname的映射,程序也会正常运行,可能是jdk内部还依赖别的环境配置吧,这个等待其它小伙伴去探究。
解决centos下tomcat启动太慢 & JDBC连接oracle太慢的问题的更多相关文章
- centos下tomcat启动卡死
遇到好几次了,总是忘记哪个位置~!!! tomcat启动时查看日志会卡在一个位置很长时间,如下 28-Aug-2018 22:56:55.216 INFO [localhost-startStop-1 ...
- 解决centos7下tomcat启动正常,无法访问项目的问题
centos7防火墙不再采用iptables命令,改用firewalld 禁用防火墙命令: # systemctl stop firewalld.service # systemctl disable ...
- 解决IDEA下tomcat启动server乱码
亲测成功的方式: 配置TOMCAT时,在VM opthions 添加 -Dfile.encoding=UTF-8
- 解决eclipse下tomcat启动超时
- CentOS7.4 系统下 Tomcat 启动慢解决方法
CentOS7.4 系统下 Tomcat 启动慢解决的方法 首先查看日志信息,查看因为什么而启动慢 在CentOS7启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是s ...
- MyEclipse 下 Tomcat启动变慢如何解决
MyEclipse 下 Tomcat启动变慢如何解决 项目使用debug启动有时候会突然变得非常慢.不但启动慢,启动之后连打开项目页面也很慢,是日常的4,5倍.可以有下面的几种解决方法: 1. ...
- Linux(Centos)下jdbc连接oracle速度超慢的问题
最近在centos下写个java swing程序,发现在linux用jdbc连接oracle及其缓慢,还经常失败.但是同样的程序在windows下运行就连接的非常快.网上搜索了很长时间都和我这情况没关 ...
- 解决linux下tomcat停止进程任存在问题
解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...
- (转)CentOS下开机启动查看管理命令:chkconfig用法
CentOS下开机启动查看管理命令:chkconfig用法 CentOS下开机启动查看管理的命令是:chkconfig 1. 开机启动列表查看: chkconfig --list 说明 ...
随机推荐
- Redis内存数据库在Exchange会议室的整体应用架构
注:本文是别人写的,感觉写得很好就转过来,版权归原作者所有哦,谁知道出处可以告诉我,谢谢. 根据以上的会议室应用现状分析,该架构的核心是把历史发生的会议室申请数据定时同步到Redis内存数据库中,对于 ...
- 阿里云ECS服务器部署HADOOP集群(四):Hive本地模式的安装
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 本地模式需要采用MySQL数据库存储数据. 1 环境介绍 一台阿里云ECS服务器:master ...
- 生产环境Shell脚本Ping监控主机是否存活(多种方法)
在网上针对shell脚本ping监控主机是否存活的文档很多,但大多都是ping一次就决定了状态,误报率会很高,为了精确判断,ping三次不通再发告警,只要一次ping通则正常.于是,今天中午抽出点时间 ...
- 损失函数———有关L1和L2正则项的理解
一.损失函: 模型的结构风险函数包括了 经验风险项 和 正则项,如下所示: 二.损失函数中的正则项 1.正则化的概念: 机器学习中都会看到损失函数之后会添加一个额外项,常用的额外项一般有2种, ...
- 清除Windows系统图标缓存
如果改变程序图标重新编译之后看到的图标并未改变,这可能不windows缓存了之前的图标导致的,需要清除Window的图标缓存来显示正确的图标. 下面是清除Windows系统图标缓存的批处理代码: re ...
- getOutputStream() has already been called for this response 从了解到解决
一.背景说明 在tomcat的localhost.log日志中时长见到 getOutputStream() has already been called for this respon ...
- HTTP常见响应状态码及解释、常用请求头及解释
1.HTTP常见响应状态码及解释2XX Success(成功状态码) 200 表示从客户端发来的请求在服务器端被正常处理204 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主 ...
- 安装Linux操作系统,学习Linux基础
第一项:安装Linux系统 遇到的问题: 1.操作过程中遇到权限不足的情况. 解决过程:通过百度后发现可以使用sudo,或chmod命令解决. 2.在以上过程中对chmod命令的用法产生疑惑. 解决过 ...
- PHP收集一些常用函数与好用的自定义函数
.自定义打印函数P //自定义打印function pp($data,$exit=0){// 定义样式 $str='<pre style="display: block;padding ...
- ETCD:词汇表
原文地址:词汇表 本文档定义了etcd文档,命令行和源代码中使用的各种术语. Alarm 每当集群需要操作员干预以保持可靠性时,etcd服务器都会发出警报. Authentication 身份验证管理 ...