`
bnmnba
  • 浏览: 293529 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Linux Centos 7.2 JDK 1.7.0 Tomcat8.5 部署的web应用(连接池druid),长时间不用后,再次访问很慢卡住

 
阅读更多

JDK 1.7.0 + Tomcat 8.5 部署的web应用,启动后第一次打开很快。长时间不用后,再次浏览器访问时很慢卡住,或是socket连接超时。后台代码卡住的位置不是很确定,后来发现都是卡到了Service层。连接池是druid 1.0.8。

解决问题的思路:

1.首先确定卡在那里。

(方法用jps和jstack和远程调试)

问题重现后立即进行如下操作:

a.找到进程ID,查看进程命令:ps -ef      或者  jps -v

b.查看java进程中的线程命令:jstack 进程ID

   可以看到java进程里的每个线程的调用栈。

   类似如下图(linux在内网,用外网的windows截图代替)

 可以看到每个线程目前运行到哪里。

如果是和我一样卡在Service层的方法,而且里面又有类似getConnection这样获取数据库连接的情况下:



 
Service层方法有事务,事务需要数据库连接,连接池里连接长时间不用会断开。

这就是我的问题原因。可以用netstat -ant | grep 11521可查看这些被卡住的socket连接。

 

 

2.我的问题解决方法:a+b双管齐下

a.避免因为安全随机数慢导致获取连接卡住,centos7.2里用jdbc连接Oracle时,会因为这个问题超时[socket reset]或程序卡住,在tomcatbin/目录下新建setenv.sh文件内容如下(注意英文双引号和"/./"是必须的):

export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
#export CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=18000"
#export CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=18000,server=y,suspend=n,timeout=60000"
export  JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m $JAVA_OPTS"

设置后,tomcat的启动速度加快很多。

 

b.尝试修改我的druid数据源配置后:这个配置应该可以解决大部分问题。

 

initialSize=5 初始化5个连接
minIdle=5 最小空闲5个连接
maxActive=20 最多20个连接
maxWait=10000  获取连接最多等待10000毫秒
useUnfairLock=true 处理等待时使用非公平锁
testWhileIdle=true 检查空闲连接可用性
timeBetweenEvictionRunsMillis=60000 一分钟检查一次空闲连接,同时关闭多余的空闲连接 毫秒
testOnBorrow=true 获取连接前检查可用性
minEvictableIdleTimeMillis=300000 一个连接在池中最小生存的时间毫秒
validationQuery=select 1 from dual
validationQueryTimeout=4 检查连接可用性的超时时间4秒

但是我这台电脑上发现每次打开都很卡,使用netstat -ant | grep 11521可以看到数据库连接要么没有,要么已经wait_close。然后我停用了Druid,换Spring自带数据源:

    <!-- 数据源配置, 不使用连接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

 

使用netstat -ant | grep 11521 可以看到总是有数据库连接是建立的。 观察几个星期,问题都不在出现了。问题解决!

 

但是druid哪里设置错了吗?有知道的可以回复一下,告诉我。

 

2019年12月10日

spring boot 开发的微服务项目存在同样问题,jdbc('org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '1.4.1.RELEASE'),spring boot默认使用连接池:org.apache.tomcat.jdbc.pool.ConnectionPool

jstack信息:

Full  thread  dump  Java  HotSpot(TM)  64-Bit  Server  VM  (25.172-b11  mixed  mode):

"XNIO-2  task-6"  #61  prio=5  os_prio=0  tid=0x00007fddb4004800  nid=0x16a1  runnable  [0x00007fde84bcb000]
      java.lang.Thread.State:  RUNNABLE
at  sun.nio.ch.FileDispatcherImpl.read0(Native  Method)
at  sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at  sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at  sun.nio.ch.IOUtil.read(IOUtil.java:197)
at  sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
-  locked  <0x00000000d1c78c28>  (a  java.lang.Object)
at  oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:144)
at  oracle.net.ns.NIOHeader.readHeaderBuffer(NIOHeader.java:82)
at  oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:139)
at  oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:101)
at  oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:80)
at  oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:98)
at  oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534)
at  oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485)
at  oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at  oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at  oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:213)
at  oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:37)
at  oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:733)
at  oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904)
at  oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082)
at  oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1737)
at  oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1692)
-  locked  <0x00000000d1c6e380>  (a  oracle.jdbc.driver.T4CConnection)
at  oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:300)
at  org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:509)
at  org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:443)
at  org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:784)
at  org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635)
at  org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:187)
at  org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)
at  org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at  org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at  org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)
at  org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)
at  org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:338)
at  org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy165.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
at com.sun.proxy.$Proxy124.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at com.xxxxxx.core.dao.impl.BaseDaoImpl.select(BaseDaoImpl.java:23)
at com.xxxxxx.core.dao.impl.BaseDaoImpl$$FastClassBySpringCGLIB$$fa9bc947.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.xxxxxx.core.dao.impl.BaseDaoImpl$$EnhancerBySpringCGLIB$$789fcc35.select(<generated>)
at com.xxxxxx.core.service.PublicService.queryUserDeptCount(PublicService.java:58)
at com.xxxxxx.core.configurate.LoginInterceptor.preHandle(LoginInterceptor.java:45)
at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:958)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.serv

 

解决方法类似(停用连接池):

spring.datasource.type=org.springframework.jdbc.datasource.DriverManagerDataSource
spring.datasource.url=jdbc:oracle:thin:@xxx:xx/xx
spring.datasource.username=xx
spring.datasource.password=xx
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
#spring.datasource.initialSize=1
#spring.datasource.maxActive=200
#spring.datasource.minIdle=5
#spring.datasource.maxIdle=20

 

必须使用连接池?

那么可以考虑把连接池设置为:得到连接时不验证连接可用性,同时缩短空闲连接可用性检查的间隔,同时设置检查可用性的超时时间。如果没有任何bug(尤其超时时间可能有问题,你设置了,jdbc驱动可不一定会用)那么理论上不会卡。祝你好运!

 

https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.html

https://www.cnblogs.com/prefectjava/p/9397999.html

https://www.cnblogs.com/yeahwell/p/9252931.html

  • 大小: 49.8 KB
  • 大小: 1.9 MB
分享到:
评论

相关推荐

    jdk-7u45-linux-x64.tar.gz centos 6.5 jdkjdk1.7.0_45

    标题中的"jdk-7u45-linux-x64.tar.gz"指的是Java Development Kit(JDK)的第7个更新版本45,适用于64位的Linux操作系统。它以.tar.gz格式压缩,这是一种常见的Linux和Unix系统中用于打包和压缩文件的方法。这个文件...

    Linux下JDK+Tomcat安装配置

    Linux下JDK+Tomcat安装配置 在本文档中,我们将详细介绍如何在CentOS系统上安装和配置JDK和Tomcat环境。以下是整个安装和配置过程的步骤。 一、下载所需文件 在开始安装之前,需要下载两个必要的文件:jdk-7u25-...

    centos7 下 Tomcat8.5的安装和配置.附带Tomcat安装包

    在Linux系统,特别是CentOS 7环境下,安装和配置Apache Tomcat 8.5是部署Java Web应用程序的关键步骤。Tomcat作为一个开源的轻量级应用服务器,主要用于运行Servlet和JSP应用。下面是详细的安装和配置过程: **1. ...

    CentOS7.2安装jdk、tomcat、MySql、Redis、zigw病毒查杀、FastDFS等等_Linux.zip

    CentOS7.2安装jdk、tomcat、MySql、Redis、zigw病毒查杀、FastDFS等等_Linux

    腾讯云服务器Linux CentOS 7.2 yum安装LAMP环境

    ### 腾讯云服务器Linux CentOS 7.2 yum安装LAMP环境 #### 知识点一:腾讯云服务器租赁与基本配置 - **腾讯云服务器租赁**:首先需要注册并登录腾讯云平台,选择合适的服务器配置进行租赁。文中提到作者选择了...

    linux版本jdk1.7.0_80以及安装步骤.rar

    Linux版本的JDK 1.7.0_80是Java Development Kit的一个早期版本,专为Linux操作系统设计。这个版本的JDK对于那些需要在Linux环境下运行或开发Java应用程序的人来说至关重要。下面我们将详细介绍JDK 1.7.0_80在Linux...

    Linux安装java环境已经tomcat8.5.77版本脚本

    本主题将深入探讨如何在Linux系统上安装Java环境以及Tomcat 8.5.77版本,这是一个广泛使用的Java应用服务器,常用于部署Web应用程序。 首先,让我们了解一下Java环境的安装。Java开发工具包(JDK)包含了编译、调试...

    Linux CentOS 7.2.txt

    Linux CentOS 7.2,自己用的,亲测可以用,记录并分享给大家,不用那么难找Linux是开源的操作系统是一个支持多用户、多进程、多线程、实时性较好、功能强大而稳定的操作系统,也是目前运行硬件平台最多的操作系统。...

    CentOS7.2 ISO百度网盘下载地址

    CentOS7.2版本的ISO包,text文件中为永久有效分享的百度网盘下载链接地址,若是由于某些原因导致失效,还烦请私信。

    centos7系统 jdk1.7 tomcat7.0

    本文将深入探讨如何在CentOS 7系统上安装和配置Java Development Kit (JDK) 1.7以及Apache Tomcat 7.0,这两个组件对于运行Java Web应用至关重要。 首先,我们来了解JDK 1.7。Java JDK是Java编程语言的软件开发工具...

    apache-tomcat-8.5.96安装包(含windows和linux版本).zip

    apache-tomcat-8.5.96安装包(含windows和linux版本).zip包含如下内容: apache-tomcat-8.5.96-windows-x64.zip; apache-tomcat-8.5.96-windows-x86.zip; apache-tomcat-8.5.96.exe; apache-tomcat-8.5.96.tar....

    centos7.2.rar

    这个是镜像文件的压缩包,可以在解压后直接在vmware打开,下面是步骤。 1.解压压缩包。 2.打开vmware,点击右上角的文件,点击打开。 3.找到解压后的文件夹,连续点击打开,选中里面的文件。 4.完成创建。

    Linux Centos7 系统Tomcat8.5.54 配置SSL证书

    由于Tomcat爆出漏洞,前几天公司让在测试环境配置Tomcat8.5.51的https ,配置了很久都不对。最后换了Tomcat8.5.54的才配置成功。下面就是我配置的过程,记录一下,与大家共勉。 1.首先公司的泛域名,运维给了ssl证书...

    jdk1.7.0_79.x86_64-linux.tar.gz

    《深入解析CentOS7下的JDK7:基于jdk1.7.0_79.x86_64-linux.tar.gz》 在IT行业中,Java开发是不可或缺的一部分,而JDK(Java Development Kit)则是Java编程的基础。本文将深入探讨CentOS7操作系统下JDK7的安装与...

    centos7.2.1511下载地址.txt

    Centos7.2.1511 网盘下载 ,text文件中为永久有效分享的百度网盘下载链接地址。********************

    CentOS7.2Linux安装OracleDatabase12c

    ### CentOS 7.2 Linux 安装 Oracle Database 12c 知识点解析 #### 一、虚拟机配置及搭建 **知识点1:虚拟机硬件配置** - **CPU**: 推荐至少配备4个核心,以确保Oracle数据库运行时有足够的处理能力。 - **内存**: ...

    Linux系统管理基础项目教程(CentOS7.2)(微课版)-课件PPT.zip

    Linux系统管理基础项目教程主要针对的是CentOS 7.2版本,这是一款广泛使用的开源操作系统,尤其在服务器领域。CentOS是Community ENTerprise Operating System的缩写,它基于RHEL(Red Hat Enterprise Linux)源代码...

    CentOS_JDK_Tomcat配置

    在IT领域,尤其是在服务器管理与部署中,CentOS操作系统经常被用作基础平台,而JDK(Java Development Kit)和Tomcat则是常见的软件组件,用于搭建Java应用服务器环境。以下是对"CentOS_JDK_Tomcat配置"相关知识点的...

    apache-tomcat-8.5.55.tar.gz

    Apache Tomcat是一款开源的Java Servlet容器,用于部署和运行Java Web应用程序。在Linux系统中安装`apache-tomcat-8.5.55.tar.gz`文件的过程涉及多个步骤,包括下载、解压、配置和启动服务。以下是详细的安装和配置...

Global site tag (gtag.js) - Google Analytics