关于用JDBC连接数据库服务器,非活动超时的问题,请教高手

麻烦问下各位高手,我用JDBC和AS400上DB2进行连接,但是一般过30分钟左右,400就自动把连接给断了,必须重新连接一下才行,哪位大侠知道这个是什么原因?多谢了
这30分钟,我没有做任何操作!
我问了一下AS400的大侠们,他们说数据库都有非活动超时的时间设置,需要在应用服务器上设置一个定时发送虚语句的参数,请教各位高手,在什么地方设置这个参数啊?
还有从现象上看,貌似和服务器关系不是很大,因为,我用同一个JDBC的驱动连不同的AS400的db2数据库,其中一个有这个问题,一个就没有
参与8

6同行回答

Xiao QingXiao Qing系统工程师浪潮商用机器有限公司
Db2 for IBM i和TCP配置中没有空闲超时的设置,这个问题主要是由于网络中的空闲计时器引起的,计时器一般在交换机或防火墙上。报错信息一般在QZDASOINIT作业日志中,系统日志和系统操作员日志中也会有相关记录。建议1.调整交换机和防火墙的idle timeout。2.调整连接池的id...显示全部

Db2 for IBM i和TCP配置中没有空闲超时的设置,这个问题主要是由于网络中的空闲计时器引起的,计时器一般在交换机或防火墙上。报错信息一般在QZDASOINIT作业日志中,系统日志和系统操作员日志中也会有相关记录。
建议
1.调整交换机和防火墙的idle timeout。
2.调整连接池的idle timeout,使之小于网络的idle timeout。
Connection pool代码的片段,可以用setMaxIdleTime方法设置idle timeout的时间。

public class TestJDBCConnPoolSnippet
{
    void test()
    {
        AS400JDBCManagedConnectionPoolDataSource cpds0 = new AS400JDBCManagedConnectionPoolDataSource();

        // Set general datasource properties.  Note that both connection pool datasource (CPDS) and managed
               // datasource (MDS) have these properties, and they might have different values.
        cpds0.setServerName(host);
        cpds0.setDatabaseName(host);//iasp can be here
        cpds0.setUser(userid);
        cpds0.setPassword(password);
   

        cpds0.setSavePasswordWhenSerialized(true);

        // Set connection pooling-specific properties.
        cpds0.setInitialPoolSize(initialPoolSize_);
        cpds0.setMinPoolSize(minPoolSize_);
        cpds0.setMaxPoolSize(maxPoolSize_);
        cpds0.setMaxLifetime((int)(maxLifetime_/1000));  // convert to seconds
        cpds0.setMaxIdleTime((int)(maxIdleTime_/1000));  // convert to seconds
        cpds0.setPropertyCycle((int)(propertyCycle_/1000));  // convert to seconds
        //cpds0.setReuseConnections(false);  // do not re-use connections

3.用命令CHGTCPA减少AS/400的TCP keep-alive时间,使之小于防火墙的idle timer。

仅供参考

收起
系统集成 · 2021-07-09
浏览799
badmousebadmouse打杂华润万家
这个在链接池里面默认有设置的,改了就OK吧显示全部
这个在链接池里面默认有设置的,改了就OK吧收起
2009-12-31
浏览1021
chnbyvchnbyvlrwonders
听说默认的不使用超时是30分钟,失效超时是0,就是无效。那么默认就是30分钟会降低到连接池的最小值。如果设置了失效超时,那么连接达到失效超时那么久的未活动的时候,就会强行从数据库断开,无论目前是空闲还是被应用拿着,甚至连接池会降低到连接最小数一下,有时在监控中看到free ...显示全部
听说默认的不使用超时是30分钟,失效超时是0,就是无效。
那么默认就是30分钟会降低到连接池的最小值。
如果设置了失效超时,那么连接达到失效超时那么久的未活动的时候,就会强行从数据库断开,无论目前是空闲还是被应用拿着,甚至连接池会降低到连接最小数一下,有时在监控中看到free pool为负数可能就是和这个有关。
好处是防止连接泄露,和数据库网络故障导致的连接不可用。收起
2009-12-14
浏览1007
有几个方面会造成连接不用时被断开1. 数据库设置在用户会话空闲时间超过一,会断开连接2. 操作系统可能也会监测非活动的连接,超过某个时值断掉3. 连接经过了路由器等网络设备,设备监测到非活动连接超过某个时值断掉通常在 ftp、telnet 或 ssh 连接可以定期发送空操作 nop,以...显示全部
有几个方面会造成连接不用时被断开

1. 数据库设置在用户会话空闲时间超过一,会断开连接
2. 操作系统可能也会监测非活动的连接,超过某个时值断掉
3. 连接经过了路由器等网络设备,设备监测到非活动连接超过某个时值断掉

通常在 ftp、telnet 或 ssh 连接可以定期发送空操作 nop,以使服务器不会断开连接。而对于数据库连接池也是因连接池的实现不同而有不同的解决办法。

你可以在连接池实现中定期执行一个最不耗资源的数据库操作,相当于 nop 空操作。比如 C3P0 连接池可以这样配置:


60

这是我们原来对付路由器的限制用的办法

在 was 中,你可以把连接池的 “时效超时” 属性设置的比 30 分钟小点,使连接池中的连接在服务器杀它这前主动断开,这样肯定是会影响到连接池的性能,更为频繁的获取连接。

实际中你应该找到是在哪一层对空闲连接的超时限制,比如 AS400 上的限制,或DB2  的会话空闲时长设置,然后改长到一个更为合适的时间。收起
2009-06-04
浏览1078
hasheihashei系统工程师万达信息股份有限公司
如果你发生的是我上述所说情况,那说明是正常情况,不用的资源应该返回到连接池中。如果不是,请把连接数据库的方法描述的清楚一些显示全部
如果你发生的是我上述所说情况,那说明是正常情况,不用的资源应该返回到连接池中。如果不是,请把连接数据库的方法描述的清楚一些收起
系统集成 · 2009-06-04
浏览1028
hasheihashei系统工程师万达信息股份有限公司
你是配置的JDBC连接池么,使用连接池的话应该是长连接啊,至少会有初始连接数那么多个连接保持着(在数据源的连接属性里可以设置)。大于初始连接数的连接在shrink Time到来时如果没人使用会被回收。你说的inactive timeout,是指程序在这段时间没有访问数据库后,会把资源返回到连...显示全部
你是配置的JDBC连接池么,使用连接池的话应该是长连接啊,至少会有初始连接数那么多个连接保持着(在数据源的连接属性里可以设置)。大于初始连接数的连接在shrink Time到来时如果没人使用会被回收。你说的inactive timeout,是指程序在这段时间没有访问数据库后,会把资源返回到连接池当中。收起
系统集成 · 2009-06-04
浏览1026

提问者

dqdgxiao
软件工程师中信国安
擅长领域: 中间件

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2009-06-04
  • 关注会员:1 人
  • 问题浏览:8315
  • 最近回答:2021-07-09
  • X社区推广