33.3. 活动连接监控

所谓的活动连接,是指客户端程序从数据库连接池取到连接后,正在执行任务或者未释放的连接。通过Apusic应用服务器JDBC服务提供的活动连接监控,我们可以知道指定数据源的数据库连接池使用状况,比如当前连接池的空闲连接数,活动连接数等,并可查看到指定某个连接的调用栈。如果正在数据库连接池的连接总数一直在上涨并且空闲连接越来越少甚至一直为零,就有警惕是否发生连接泄露了。这时通过查看指定连接的栈,我们就可以查找客户程序中是否未关闭连接。

我们再来理解一下客户端连接与物理连接的区别。客户端连接是指客户端程序通过javax.sql.DataSource的getConnection()方法取得的连接,代表客户程序中的连接对象(java.sql.Connection),它不是真正的跟数据库之间的物理连接。由于在一个事务里,允许多个客户端连接共享一个物理连接,因此,客户端连接跟物理连接之间是多对一的关系。

由于数据库的连接资源是有限的,这就要求客户程序在用完连接后,应该主动释放此连接资源以供后来者使用。通常认为如果客户程序未主动使用java.sql.Connection.close()方法关闭连接,就会出现连接泄露,随着泄露连接数的增长,最终耗光了连接资源,系统就变为不可用了。很多情况下是这样的,但在使用Apusic数据库连接池时,Apusic应用服务器对此做了容错处理,使得出现此类连接泄露的几率大大降低。这是因为在完成一次组件调用后,Apusic会检查此次调用中使用过的连接资源,首先取消物理连接与客户端连接的关联,然后把物理连接放回空闲连接池以供别的客户端调用使用。此时,上述未关闭的客户端连接变为非活动的,它不持有一个物理连接,因此即使客户程序忘了关闭连接也不会发生连接泄露的问题。当下次调用又使用了上次调用未关闭的连接时,Apusic的数据源连接服务会重新激活此连接,并重新为其关联一个物理连接,这时它又是一个活动连接了。

虽然如此,但在使用Apusic数据库连接池时,仍有可能会出现连接泄露的情况,如:此连接是在Apusic应用服务器所在的JVM外面通过远程调用获取的或者是在Apusic应用服务器中但连接是在客户自己启动的线程中取得的,通过这两种方式取得的连接,如果客户程序未主动执行java.sql.Connection.close()操作,则会出现连接泄露。

为了能够帮助用户查找并解决连接泄露的问题,Apusic应用服务器提供了连接监控服务。默认情况下,活动连接监控功能是关闭的,如果需要使用此功能,需编辑Apusic域主目录中,config子目录下的apusic.conf文件,其中相关配置段如下:

... <SERVICE CLASS="com.apusic.jdbc.JDBCService" >
    <ATTRIBUTE NAME="EnableActiveConnTrace" VALUE="False"/>
    </SERVICE> ... 

将EnableActiveConnTrace属性的值改为True,重新启动应用服务器后,即可通过Apusic AdminConsole工具监控活动连接。Apusic AdminConsole的使用请查阅Admin Console的管理手册。