【问题标题】:Does the compiled prepared statement in the database driver still require compilation in the database?数据库驱动中编译好的prepared statement是否还需要在数据库中编译?
【发布时间】:2012-03-22 15:35:59
【问题描述】:

在 Oracle JDBC 驱动程序中,有一个缓存准备好的语句的选项。我对此的理解是prepared statements是由驱动程序预编译,然后缓存,这提高了缓存prepared statements的性能。

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

【问题讨论】:

    标签: oracle jdbc prepared-statement


    【解决方案1】:

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

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

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

    如果物理连接上使用的准备好的语句多于缓存大小,则最长未使用的打开共享游标将关闭。这会在下次再次使用该语句时导致另一个软解析 - 因为需要再次将 SQL 发送到服务器。

    这与一些用于中间件的数据源实现的功能基本相同(例如 JBoss 中的prepared-statement-cache)。只使用两者之一以避免双重缓存。

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

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

    还可以查看支持此功能并与 FAN 交互的 Oracle 统一连接池 (UCP)。

    【讨论】:

      【解决方案2】:

      我认为这回答了您的问题:(抱歉,它是 powerpoint,但它定义了准备好的语句如何发送到 Oracle,Oracle 如何将其存储在共享 SQL 池中,处理它等)。从 Prepared 语句中获得的主要性能提升是,在第 1 次以上运行时,您可以避免对 sql 语句进行硬解析。

      http://www.google.com/url?sa=t&source=web&cd=2&ved=0CBoQFjAB&url=http%3A%2F%2Fchrisgatesconsulting.com%2FpreparedStatements.ppt&rct=j&q=java%20oracle%20sql%20prepared%20statements&ei=z0iaTJ3tJs2InQeClPwf&usg=AFQjCNG9Icy6hmlFUWHj2ruUsux7mM4Nag&cad=rja

      Oracle(或选择的 db)将存储准备好的语句,java 只是发送它与 db 将选择的语句相同的语句(这是有限的资源,但是,在 x 次无查询后,共享 sql 将被清除,尤其是。非常见查询),然后需要重新解析——无论它是否缓存在您的 Java 应用程序中。

      【讨论】:

      • 谢谢,但这不是我想要的。我了解 Oracle 如何将准备好的语句存储在共享池等中,但我试图了解缓存在 Oracle JDBC 准备好的语句缓存中的是什么。 PPT(优秀,顺便说一句)涉及到主题,但没有详细说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2016-11-17
      • 2016-11-22
      • 2023-04-02
      相关资源
      最近更新 更多