Oracle JVM数据源调优tomEE连接池中的空闲数据库连接

Oracle JVM数据源调优tomEE连接池中的空闲数据库连接,oracle,tomcat,jvm,datasource,apache-tomee,Oracle,Tomcat,Jvm,Datasource,Apache Tomee,我试图找出我的数据源定义是否是我们遇到的问题的根本原因。我们在AWS中的应用程序堆栈有几个TOME机器,它们在和ELB后面一起运行。具有的计算机会随机保留到数据库的空闲连接,而不会终止 我想知道我们能做些什么来更好地建立我们的联系和收获联系。我们的应用程序每秒有中等数量的请求 这是我们的Tomee.xml文件 <?xml version="1.0" encoding="UTF-8"?> <tomee> <!-- see http://tomee.apache.org

我试图找出我的数据源定义是否是我们遇到的问题的根本原因。我们在AWS中的应用程序堆栈有几个TOME机器,它们在和ELB后面一起运行。具有的计算机会随机保留到数据库的空闲连接,而不会终止

我想知道我们能做些什么来更好地建立我们的联系和收获联系。我们的应用程序每秒有中等数量的请求

这是我们的Tomee.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<!-- see http://tomee.apache.org/containers-and-resources.html -->
<!-- Datasources for Prod -->   
   <Resource id="DBWPC" type="javax.sql.DataSource">
      DataSourceCreator tomcat
      JdbcDriver oracle.jdbc.OracleDriver
      JdbcUrl jdbc:oracle:thin:@x.x.com:1521:service
      UserName xxxxx   
      Password xxxx
      jmxEnabled true
      InitialSize 5
      MaxActive 20
      MaxIdle 20
      MinIdle 0
      MaxWait -1
      ValidationQuery SELECT 1 FROM DUAL
      PoolPreparedStatements true
      MaxOpenPreparedStatements 0
      TestWhileIdle true
      timeBetweenEvictionRunsMillis 180000
      JtaManaged true      
   </Resource>
 <!-- Standard JMS Setup for NON-SERVER **** START **** -->
 <Resource id="PrimaryJMSRA" type="ActiveMQResourceAdapter">
            BrokerXmlConfig=
          ServerUrl = tcp://x.x.com:61616
  </Resource>
  <Resource id="JmsConnectionFactory" type="javax.jms.ConnectionFactory">
            ResourceAdapter = PrimaryJMSRA
    </Resource>
 <Container id="JmsMdbContainer" ctype="MESSAGE">
    ResourceAdapter = PrimaryJMSRA
</Container>
<Container id="wpcStatelessContainer" type="STATELESS">
 accessTimeout = 30 seconds
 callbackThreads = 5
 closeTimeout = 5 minutes
 garbageCollection = false
 idleTimeout = 0 minutes
 maxAge = 0 hours
 maxAgeOffset = -1
 maxSize = 5000
 minSize = 20
 replaceAged = true
 replaceFlushed = false
 strictPooling = false
 sweepInterval = 5 minutes
 </Container>
 <Container id="wpcSingletonContainer" type="SINGLETON">
    accessTimeout = 30 seconds
</Container>

数据源处理器tomcat
JdbcDriver oracle.jdbc.OracleDriver
JdbcUrl jdbc:oracle:thin:@x.x.com:1521:service
用户名xxxxx
密码xxxx
jmxEnabled-true
小号5
MaxActive 20
MaxIdle 20
迷你0
MaxWait-1
ValidationQuery从DUAL中选择1
PoolPreparedStatements true
MaxOpenPreparedStatements 0
TestWhileIdle-true
运行时间间隔180000
真的吗
BrokerXmlConfig=
服务器URL=tcp://x.x.com:61616
ResourceAdapter=PrimaryJMSRA
ResourceAdapter=PrimaryJMSRA
访问超时=30秒
callbackThreads=5
关闭超时=5分钟
垃圾收集=错误
idleTimeout=0分钟
最大年龄=0小时
maxAgeOffset=-1
最大尺寸=5000
minSize=20
replaceAged=true
replace=false
严格共享=错误
扫描间隔=5分钟
访问超时=30秒

优化取决于大量可能的工作负载,因此这可能不是最终答案,而是一种尝试。新会话被阻止/排队表示您没有足够的空间共享连接。如果在开始时看到很多连接需要创建,那么将InitialSize从5增加到20。既然你说的是200个会话,那么最好将maxactive设置为100或150,假设你有很多并发会话需要容纳

尝试下面的示例设置(考虑到您需要高并发性),如果有帮助,请告诉我:

  • testWhileIdle=“true”
  • testOnBorrow=“true”
  • testOnReturn=“false”
  • validationQuery=“选择1”
  • validationInterval=“30000”
  • timebetweenvictionrunsmillis=“5000”
  • maxActive=“100”
  • minIdle=“10”
  • maxIdle=“20”
  • maxWait=“10000”
  • initialSize=“20”
  • RemoveBandonedTimeout=“60”
  • removeAbandoned=“true”
  • log=“true”
  • MinevictableItimellis=“30000”
为什么我建议这些设置?检查以下链接:

我应该补充一点,它在数据库中造成的问题是阻塞其他SID的会话。我们有一个例子,我们有超过200个会话被空闲的SID阻塞,导致我们的应用程序停止响应。比如JVM不会为另一个请求提供服务,因为我认为它会无限期地等待。