我服务器上的postgresql状态显示的空闲数大于我在tomcat中配置的空闲数
systemctl status postgresql-9.4.service | grep idle -c
284
换一种说法:
select count(state) from pg_stat_activity where state like 'idle'
284
我的context.xml中的设置是:
<?xml version="1.0" encoding="UTF-8"?>
<Context allowCasualMultipartParsing="true">
<Resource
name="jdbc/postgres"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/db1"
username="postgres" password="*****"
initialSize ="30"
maxTotal="300" maxIdle="20" maxWaitMillis="30000"
closeMethod="close"
validationQuery="SELECT 1"
validationQueryTimeout="5"
removeAbandonedOnBorrow="true"
removeAbandonedOnMaintenance="true"
removeAbandonedTimeout="60"
logAbandoned="true"
/>
<Resource
name="jdbc/postgresDb2"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/db2"
username="postgres" password="*****"
initialSize ="30"
maxTotal="300" maxIdle="20" maxWaitMillis="30000"
closeMethod="close"
validationQuery="SELECT 1"
validationQueryTimeout="5"
removeAbandonedOnBorrow="true"
removeAbandonedOnMaintenance="true"
removeAbandonedTimeout="60"
logAbandoned="true"
/>
</Context>
我的代码中的连接是这样的:
public String asignacionMax(String type) throws ModuleException, Exception{
Connection conn = null;
PreparedStatement stmt = null;
String accountno="";
try{
String query = "select nextval('public.asignacionseq');";
conn = getConnection("GU");
stmt = conn.prepareStatement(query);
ResultSet rst = stmt.executeQuery();
String cnt="";
if(rst.next()){
cnt = rst.getString("nextval");
for(int i=cnt.length();i<9;i++){
cnt= "0"+cnt;
}
}
accountno = type+cnt;
}catch(Exception e){
throw new Exception(e);
}finally{
if (conn != null) {conn.close();}
if (stmt != null) {stmt.close();}
}
return accountno;
}
关于我的系统的信息:
服务器版本:Apache Tomcat / 9.0.5 服务器内置:2018年2月6日21:42:23 UTC 服务器编号:9.0.5.0 操作系统名称:Linux 操作系统版本:3.10.0-693.21.1.el7.x86_64 架构:amd64 JVM版本:1.8.0_161-b14
Tomcat jdbc pool定义minEvictableIdleTimeMillis
属性来控制连接必须空闲多长时间才能被认为是可驱逐的。
minEvictableIdleTimeMillis
(int)对象在符合驱逐资格之前可能在池中闲置的最短时间。默认值为60000(60秒)。
您的配置未指定此属性,因此默认情况下为60秒。
1)应该在该时间段内计算空闲连接以检查其变化。 2)定义了两个池,因此可以预期在某个时刻有两倍的空闲连接数。 3)默认情况下,每隔5秒检查一次可消除的连接,这样您可以在61秒内每隔3秒检查一次:
timeout 61 watch -n3 "systemctl status postgresql-9.4.service | grep idle -c | tee idle.log"
idle.log
应包含在此期间找到的值。
该问题的另一个方面是确保您的验证方法从池的角度来看是合适的,换句话说,如果idle
对两者都是相同的。