oracle – 数据库驱动程序中编译的预准备语句是否仍需要在数据库
在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). (编辑:广州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |