设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: google 娱乐 服务 百度
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-05-14 21:14 所属栏目:[站长百科] 来源:网络整理
导读:在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).

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读