Statements 缓存通过缓存能重复使用的statements提高性能,使程序员不必明确的生命重复使用的statements。
Statement缓存减少重复指针创建,重复的statement解析和创建,应用服务器和数据库服务器的通讯,数据库负荷。
Statement特征
Statement缓存和重用对应用是透明的。每一个statement缓存和一个物理连接关联,每一个连接有自己的statement缓存。
statement匹配严格遵守:
在statement中的SQL 字符串在缓存中必须是唯一的(大小写敏感)。
statement的类型必须是相同的(准备的或者可调用的)
statement产生的结果集的滑动类型必须是相同的(单向前或滑动的)
Statements 缓存的最大数目
数据源JDBCStatement缓存容量设置
一个JDBC statement缓存和一个数据源维护的物理连接关联,所以不能跨物理连接共享。JDBC statement在中间层维护,不是数据库。
程序员能够通过编程方式,使用connection对象的setStmtCacheSize()
方法动态的启用和禁用statement缓存。
在数据源配置中使用num-cached-statements属性配置 JDBC statement 缓存 ,设置缓存大小。不设置此属性,或设置为0,禁用缓存。
Eg:
<data-source>
...
num-cached-statements="200"
</data-source>
设置num-cached-statements属性,首先要确定应用发起到数据库不同statements有多少种,然后再设置相应的缓存容量。如果不知道确切的数量,可以使用JDBC性能测量工具帮助确定。OC4j使用statement度量需要将JAVA属性oracle.jdbc.DMSStatementMetrics设置为true。
Statement缓存大小与资源问题
每个连接维护自己的statement cache,Statement Cache会持有数据库资源,绑定在连接上的Statement Cache持有的连接数很有可能会超过最大的数据库连接数,可以通过减小num-cached-statements
的值或者增加数据库最大连接限制避免此问题。
托管数据源的satement代理
所有java.sql.*接口的实现都被OC4J用一个代理对象做了包装,包括statement对象。
有些情况下,连接代理会被重新绑定到一个新的物理连接上。比如:一个连接被用来跨事务使用时,此时,任何通过此连接代理获取的statement对象不再有效,因为它们是旧的物理连接创建的。因此,在通过物理连接获取的statement对象前放置一个代理是同样的。这些Statement代理和连接代理关联,通过连接代理监控代理和物理连接的关联,如果Statement代理确认与连接代理关联的物理连接改变了,将从连接代理获取一个新的物理Statement。