问题描述:Oracle数据库,java代码使用某数据库实例,获取connection并在使用结束关闭,而session未销毁,而是状态变为inactive从而导致临时表数据未清空。
Oracle临时表有session级别和事务级别,正常情况下session级别临时表数据会在session关闭后自动清空。而项目中同时连接了多个实例,2个实例配置参数全部一致,另一个实例在关闭connection后,session自动销毁,该实例session却仅仅是状态在切换。
原因:java web程序使用的了Oracle提供的连接池oracle.jdbc.pool.OracleDataSource.OracleDataSource()连接方式所致。
通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配置。
Oracle实现的JDBC3.0标准时,OracleDataSource默认是开启隐式连接的,这种方式下,在close connection时session并不会关闭,只是状态改变,所以会话级别的临时表数据会越来越多,一般要进行truncate。也可以通过ds.setConnectionCacheProperties(false)关闭隐式连接。所谓隐式连接其实就是把connection进行了缓存。
而oci方式下close connection时,session会释放,这时临时表数据会自动清空。