1、数据库连接,在oracle的实现中,是一条tcp链路。这个链路上,可以承载多个statement。比如最大200个连接,每连接最大300个statement,那么这个数据库可以支持6w个会话。
2、连接池自身在什么时候释放连接
连接池存在的价值就是不释放连接,下一个人申请连接时,复用已经建立的连接。(应用代码虽然调用了释放函数,但连接池不会真的释放)
连接池在任务空闲时,可以释放一部分连接。在连接池关闭时,释放所有连接。
3、如果程序崩溃,机器掉电,交换机掉电,连接就无法释放了,会怎么样?
要看jdbc实现时,有没有做应用层心跳。
4、为什么要应用层心跳,tcp底层不支持吗?
1、tcp底层支持心跳,java中叫SO_KEEPALIVE。tcp的rfc协议规定,心跳是可以选的。也就是说,协议可以不实现。即使实现了,可能默认也没开启。
2、开启后,是什么情况呢
[root@localhost B]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
[root@localhost B]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
[root@localhost B]# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
在linux中,这几个参数,表示每隔7200秒,自动发送一次心跳,如果没有应答,则每隔75秒再发一次,一共发9次。都失败,就认为断链了。你可以修改这几个参数,让心跳更频繁一些,检测更敏感一些。
3、但是,这不能代替应用层心跳
底层心跳,只能代表操作系统协议栈之间是OK的,你应用层有没有问题,就不知道了。所以应该使用应用层心跳。
另外,底层心跳包,可能被防火墙屏蔽。