IBM Data Server Driver for JDBC and SQLJ 语句缓存

可以使用内部语句缓存来提高Java应用程序的性能,通过缓存和池化预处理语句。 IBM Data Server Driver for JDBC and SQLJ 可以使用内部语句缓存来提高Java应用程序的性能,通过缓存和池化预编译语句。

内部语句缓存可用于使用 IBM Data Server Driver for JDBC and SQLJ 类型4连接的连接,或用于使用 IBM Data Server Driver for JDBC and SQLJ 类型2连接的连接, Db2 for z/OS®

可以通过以下任何一种方式启用内部语句高速缓存:

  • 通过将下列其中一个属性设置为正值:
    • com.ibm.db2.jcc.DB2ConnectionPoolDataSource.maxStatements,用于使用 javax.sql.ConnectionPoolDataSource 接口创建的对象。
    • com.ibm.db2.jcc.DB2XADataSource.maxStatements,用于使用 javax.sql.XADataSource 接口创建的对象。
    • com.ibm.db2.jcc.DB2SimpleDataSource.maxStatements,用于使用 com.ibm.db2.jcc.DB2SimpleDataSource 接口创建的对象。
  • 通过在 URL 中设置 maxStatements 属性,并将 URL 传递到 DriverManager.getConnection 方法。

启用内部语句缓存后, IBM Data Server Driver for JDBC and SQLJ 可以缓存SQLJ语句在逻辑上关闭时使用的 PreparedStatement 对象、 CallableStatement 对象和 JDBC 资源。 当在语句上显式或隐式调用 close 方法时,逻辑上关闭语句。

复用先前高速缓存的语句对应用程序是透明的。 语句高速缓存存在打开连接的生命周期。 关闭连接时,驱动程序将删除语句高速缓存并关闭所有合用语句。

在下列任一情况下,逻辑上打开的语句将不符合高速缓存的条件:

  • 语句发生异常。
  • JDBC 4.0 方法 Statement.setPoolable(false) 被调用。

IBM Data Server Driver for JDBC and SQLJ 尝试缓存语句,而内部语句缓存已满时,驱动程序会清除最近使用最少的缓存语句,并插入新语句。

在以下条件清除内部语句高速缓存:

  • 发出 SET 语句,它影响 SQL 语句的目标对象。
  • 执行一个SET语句,但 IBM Data Server Driver for JDBC and SQLJ 无法识别的语句。
  • 检测到在连接重用期间,修改了SQL语句目标对象的属性。 IBM Data Server Driver for JDBC and SQLJ 检测到在连接重用期间,修改了SQL语句目标对象的属性。 currentSchema 是修改SQL语句目标对象的属性示例。

在Java程序中,可以通过调用 DatabaseMetaData.supportsStatementPooling 方法来测试是否启用了内部语句缓存。 如果启用了内部语句高速缓存,那么此方法将返回 true

IBM Data Server Driver for JDBC and SQLJ 不会检查内部语句缓存中语句的目标对象的定义是否发生了变化。 如果在应用程序中执行 SQL 数据定义语言语句,那么需要对该应用程序禁用内部语句高速缓存。

内部语句高速缓存需要额外的内存。 如果内存变得受限,那么可以增大 JVM 大小,或减小 maxStatements 的值。