Ken*_*Liu 4 oracle jdbc prepared-statement
在 Oracle JDBC 驱动程序中,有一个选项可以缓存准备好的语句。我对此的理解是预编译语句由驱动程序预编译,然后缓存,这提高了缓存预编译语句的性能。
我的问题是,这是否意味着数据库永远不必编译那些准备好的语句?JDBC 驱动程序是否发送了一些预编译的表示,或者数据库本身是否仍然存在某种解析/编译?
当您使用隐式语句缓存(或显式语句缓存的 Oracle 扩展)时,Oracle 驱动程序将在(!)close() 之后缓存准备好的或可调用的语句,以便与物理连接重用。
那么发生的情况是:如果使用了准备好的 Statement,并且物理连接从未见过它,它会将 SQL 发送到 DB。根据 DB 之前是否见过该语句,它会进行硬解析或软解析。所以通常如果你有一个 10 个连接池,你会看到 10 个解析,其中一个是硬解析。
在连接上关闭语句后,Oracle 驱动程序会将解析语句(共享游标)的句柄放入 LRU 缓存中。下次在该连接上使用 prepareStatement 时,它会找到要使用的缓存句柄,并且根本不需要发送 SQL。这导致执行没有 PARSE。
如果在物理连接上使用的(不同的)准备语句多于缓存大小,则最长未使用的打开共享游标将关闭。下次再次使用该语句时,这会导致另一个软解析 - 因为 SQL 需要再次发送到服务器。
这与中间件的一些数据源实现的更通用的功能基本相同(例如 JBoss 中的prepared-statement-cache)。仅使用两者之一以避免双重缓存。
您可以在此处找到详细信息:
http://docs.oracle.com/cd/E11882_01/java.112/e16548/stmtcach.htm#g1079466
另请查看支持此功能并与 FAN 交互的 Oracle 统一连接池 (UCP)。
归档时间: |
|
查看次数: |
3704 次 |
最近记录: |