加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 百科 > 正文

oracle – 数据库驱动程序中编译的预准备语句是否仍需要在数据库

发布时间:2021-03-08 08:03:47 所属栏目:百科 来源:网络整理
导读:在Oracle JDBC驱动程序中,有一个选项可以缓存预准备语句.我对此的理解是,准备好的语句由驱动程序预编译,然后进行缓存,从而提高缓存预准备语句的性能. 我的问题是,这是否意味着数据库永远不必编译那些准备好的语句? JDBC驱动程序是否发送了一些预编译表示,

在Oracle JDBC驱动程序中,有一个选项可以缓存预准备语句.我对此的理解是,准备好的语句由驱动程序预编译,然后进行缓存,从而提高缓存预准备语句的性能.

我的问题是,这是否意味着数据库永远不必编译那些准备好的语句? JDBC驱动程序是否发送了一些预编译表示,或者数据库本身是否还存在某种解析/编译?

解决方法

当您使用隐式语句高速缓存(或显式语句高速缓存的Oracle扩展)时,Oracle驱动程序将在(!)close()之后高速缓存预准备或可调用语句,以便与物理连接重用.

所以会发生什么:如果使用了准备好的Statement,并且物理连接从未见过它,它会将SQL发送到DB.根据DB之前是否已经看过该语句,它将进行硬解析或软解析.所以通常如果你有一个10连接池,你会看到10个解析,其中一个解析.

在连接上关闭语句后,Oracle驱动程序会将解析语句(共享游标)的句柄放入LRU缓存中.下次在该连接上使用prepareStatement时,它会找到要使用的缓存句柄,而根本不需要发送SQL.这导致执行NO PARSE.

如果在物理连接上使用了多个(不同的)预准备语句,而不是缓存大小,则关闭最长的未使用的开放共享游标.这会在下次再次使用该语句时导致另一个软解析 – 因为SQL需要再次发送到服务器.

这基本上与中间件的一些数据源更一般地实现(例如JBoss中的prepared-statement-cache)功能相同.仅使用其中一个来避免双重缓存.

你可以在这里找到详细信息:

http://docs.oracle.com/cd/E11882_01/java.112/e16548/stmtcach.htm#g1079466

另请查看支持此功能并与FAN交互的Oracle统一连接池(UCP).

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读