【问题标题】:Huge performance hit when using Java/OJDBC使用 Java/JDBC 时性能受到巨大影响
【发布时间】:2010-10-01 23:28:44
【问题描述】:

在使用带有“ojdbc.jar”作为客户端的 Java 时,我遇到了一些奇怪的行为。

我有一个简单的程序,它尝试使用一个查询插入 500 行。 (一个 INSERT ALL FROM dual)。

这个程序在 Java 中需要 25 秒才能完成。这是 statement.execute() 方法完成的时间。

我从 SQLplus/SQLdeveloper 运行查询只需不到 1 秒。

有什么想法吗?

【问题讨论】:

    标签: java performance oracle driver


    【解决方案1】:

    听起来您每次插入都会获得新的连接。

    【讨论】:

    • 我应该在我的问题中澄清。只有一个查询被执行,它恰好插入了很多行。
    【解决方案2】:

    虽然您的性能问题似乎过多并且超出了它应该引起的问题,但值得注意的是,Java JDBC-ODBC 驱动程序的速度非常慢。如果可能,请为您的数据库使用本机驱动程序,因为它们通常会更快。

    【讨论】:

      【解决方案3】:

      一般来说,您可能希望避免使用非常大的 SQL 语句,尤其是 INSERT ALL FROM DUAL 技巧。我不知道为什么,但我见过几个 Oracle 需要很长时间来解析大型 SQL 语句的情况。出于某种原因,“insert into table_name (select 'asdf' from dual union all select 'asdf from dual ...)”似乎效果更好,但一段时间后它仍然开始变慢。

      我曾经对不同大小的类似查询进行计时,并且解析时间似乎在某个时候呈指数增长。我相信那是在 10.2.0.3.0 上。但是我现在无法在 10.2.0.1.0 上重现该问题,也许这只是特定版本的错误?

      我建议您改用 UNION ALL 版本,并减少每条语句发送的行数。另一种解决方案是构建一个 PL/SQL 块来执行插入操作。 Oracle 似乎比大型 SQL 更能解析大型 PL/SQL,但这种解决方案更复杂。

      (顺便说一句,它在 SQL Developer 中运行得更快可能只是一个巧合。由于问题在于解析时间,所以第二次运行它总是会更快。)

      【讨论】:

        猜你喜欢
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2016-05-10
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        相关资源
        最近更新 更多