mysql - Tomcat启动时如何避免分钟延迟

标签 mysql tomcat bonecp

我们在许多生产服务器上的服务器启动期间遇到了几分钟的显着延迟,但无法在测试环境中重现此问题。有没有人对如何调试或修复此问题有任何建议?它发生在 Tomcat 6 和 Tomcat 7 上

我们的设置是 Tomcat 7 Spring 3.1.2 休眠 4.1.7 BoneCP 0.7.1 Mysql连接5.1.23 新遗迹

似乎与Bone CP有关

[MSA] DEBUG [2013-02-18 14:58:34,903] DefaultListableBeanFactory.invokeInitMethods(1498) | Invoking afterPropertiesSet() on bean with name 'dataSource'
[MSA] DEBUG [2013-02-18 14:58:34,919] BoneCPDataSource.maybeInit(148) | JDBC URL = jdbc:mysql://1.1.1.1:3306/db_prod?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&sessionVariables=FOREIGN_KEY_CHECKS=0, Username = xyz, partitions = 3, max (per partition) = 30, min (per partition) = 10, helper threads = 3, idle max age = 3 min, idle test period = 2 min
[MSA] DEBUG [2013-02-18 15:01:11,474] DefaultListableBeanFactory.doGetBean(245) | Returning cached instance of singleton bean 'managerTx'

我们的Bone CP设置如下

<bean id="dataSource"
   class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
   <property name="targetDataSource">
       <ref local="mainDataSource" />
   </property>
</bean>

<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="idleMaxAgeInMinutes" value="3"/>
    <property name="idleConnectionTestPeriodInMinutes" value="2"/>
    <property name="maxConnectionsPerPartition" value="30"/>
  <property name="minConnectionsPerPartition" value="10"/>
  <property name="partitionCount" value="3"/>
  <property name="acquireIncrement" value="2"/>
  <property name="statementsCacheSize" value="100"/>
  <property name="releaseHelperThreads" value="3"/>
</bean>

基于 Mindas 的建议。这是等待期间发生的事情的堆栈跟踪

"pool-3-thread-1" prio=10 tid=0x00007fd26c004000 nid=0x5c7e runnable   [0x00007fd2c4722000]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
    - locked <0x00000000ccf12490> (a com.mysql.jdbc.util.ReadAheadInputStream)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3049)
    at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:597)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1084)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    - locked <0x00000000ccf04310> (a com.mysql.jdbc.JDBC4Connection)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)
    at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:256)
    at com.jolbox.bonecp.ConnectionHandle.obtainInternalConnection(ConnectionHandle.java:211)
    at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:170)
    at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:371)
    at com.jolbox.bonecp.BoneCPDataSource.maybeInit(BoneCPDataSource.java:150)
    at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:112)
    at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy.afterPropertiesSet(LazyConnectionDataSourceProxy.java:163)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    - locked <0x00000000dc56d780> (a java.util.concurrent.ConcurrentHashMap)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    - locked <0x00000000dc56d780> (a java.util.concurrent.ConcurrentHashMap)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)

最佳答案

发送 kill -3(如果在 Unix 上,或 corresponding signal 如果在 Windows 上)到您的 Tomcat 进程 ID,当它被卡住时。您将在 catalina.out 中看到所有具有完整堆栈跟踪的线程。

编辑:堆栈跟踪快照似乎正处于启动连接的过程中。您能否验证(使用本地 mysql 客户端)您可以毫无延迟地连接(提示:DNS 问题)并快速执行命令——使用与 JDBC 完全相同的配置?

关于mysql - Tomcat启动时如何避免分钟延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156495/

相关文章:

java - 在 Tomcat 7 上运行 Framework 2.2.2 - 删除 BoneCP

log4j - BoneCP 不记录 SQL 语句

php - 停止 PHP if 语句覆盖下面的 CSS 语句?对 MySQL 正确吗?

c++ - glibc mysql_stmt_close 释放坏内存?

mysql - 在 Rails 5/mysql 中制定左连接查询时出现的问题

java - 无法从 Windows 中的 Tomcat 服务器访问资源

java - 在 Spring 与 BoneCP : "Database access prob lem. Killing off this connection..." 进行预定操作时连接断开

java - Sql多对多查询问

Tomcat 8 SSL 与 ArcGIS 服务器

java - JavaMelody 和 ab 中的 tomcat 性能监控