【问题标题】:Does Oracle DB support multiple (parallel) operations per connection?Oracle DB 是否支持每个连接的多个(并行)操作?
【发布时间】:2011-08-22 06:48:39
【问题描述】:

我的 Java 应用程序需要将光标保持在 Oracle DB 上一段时间。在此期间,必须进行其他 DB 语句。这需要单独的数据库连接还是可以使用相同的(光标的)?

谢谢。

【问题讨论】:

  • 你试过了吗?结果是什么?
  • 您说的是哪种 Java 应用程序? Oracle 非常适合处理一系列语句的专用会话。但是,大多数 Java 应用程序都是 Web 应用程序,Web 应用程序通常使用 无状态 协议和连接池;这意味着很难为特定用户保留一个数据库会话以在一段时间内发出命令。因此,请提供更多详细信息。你的意思是“并行”还是应该是“顺序”? Oracle 支持并行查询/DML,但这是一个不同的问题。

标签: java oracle connection


【解决方案1】:

唯一的限制是单个语句在给定时间只能有一个 ResultSet。请注意,一条语句可以生成多个 ResultSet,但您必须按顺序访问它们(使用 getNextResult()

为了能够拥有多个打开的结果集/游标,您需要多个 java.sql.Statement 对象。

单个连接只能有一个活动(即正在运行)语句。因此,如果您需要多个打开的游标(结果集),则需要按顺序(一个接一个)运行它们,每个游标都有自己的 Statement 对象。

【讨论】:

    【解决方案2】:

    Oracle 对 MSSQL 人员所说的 MARS(多活动结果集)没有任何问题。

    您可以在很多 PL/SQL 代码中看到这种情况,就此而言,PL/SQL 就像您的 Java 代码一样“只是”SQL 引擎的客户端:

    for a in (select field1, field2 from table1) loop
      for b in (select * from table2 where SomeField = a.Field1) loop
        ...
      end loop;
    end loop;
    

    不过,不要相信我的话。您可以在 Java 中自己创建这样的嵌套循环。

    【讨论】:

      【解决方案3】:

      当然,您可以在同一连接上发出其他查询时保持多个打开的游标。但是,在打开第一个游标时不能发出其他查询或语句。这是因为在任何时间点,Oracle 会话中只能有一个请求处于活动状态(即被执行)。

      【讨论】:

        【解决方案4】:

        您可以使用数据库池的概念。

        Click Here

        它提供了一个数据库连接池,因此您可以在需要时从池中获取数据库连接。

        由于数据库连接和关闭是一个繁重的过程,它还优化了内存。

        【讨论】:

        • 问题的重点是 OP 不想要多个连接,但是,想知道他是否可以在保持光标打开的同时执行其他 sql——他可以!跨度>
        • 是的,我可以(并且可能会)使用池,但是,正如 James 指出的那样,问题是关于使用相同的连接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多