【问题标题】:Single connection with Oracle与 Oracle 的单一连接
【发布时间】:2017-03-14 15:45:03
【问题描述】:

在我的项目中,开发人员使用单个连接实例,而不是 Oracle 12c 上的连接池。

使用池是一种常见的做法,Oracle 自己记录了它:http://docs.oracle.com/database/121/JJUCP/get_started.htm#JJUCP8120

但是JDBC 4.2 specification 说:

13.1.1 创建语句

每个 Connection 对象可以创建多个可供程序同时使用的 Statement 对象。

如果可以使用语句来管理并发,为什么要使用连接池而不是单个连接?

【问题讨论】:

  • 这个答案:stackoverflow.com/a/5949505 提到 Oracle 连接只能有 1 个活动语句。但我无法在 Oracle 文档中验证此信息。

标签: oracle jdbc connection-pooling


【解决方案1】:

Oracle 数据库开发团队强烈反对在多个线程中使用单个连接。这几乎总是会导致问题。作为一般规则,我们不会考虑任何这样做的问题报告。

一个连接可以同时打开多个语句和/或结果集,但一次只能执行一个。连接是严格的单线程和阻塞的。我们试图防止多个线程同时访问一个连接,但有一些奇怪的情况是可能的。这些几乎肯定会导致问题。 (主要出于性能原因修复或防止这些情况是不切实际的。只是不要跨多个线程共享单个连接。)

【讨论】:

    【解决方案2】:

    如果客户端通过专用服务器连接连接到数据库,则该数据库会话将只为该客户端提供服务。如果客户端通过共享服务器连接连接到数据库,那么给定的数据库会话可能会在其生命周期内为多个客户端提供服务。

    这是documented here

    此外,在任何一个时间点,会话一次只能执行一件事。如果不是这样,那么并行运行就不会产生多个其他会话!

    【讨论】:

      【解决方案3】:

      单个连接不能同时执行多个语句。

      【讨论】:

      • 但是 JDBC 规范提到一个连接可以创建多个要同时使用的语句(谢谢,我已经更新了我的问题)。
      【解决方案4】:

      是的,一个连接可以执行多个语句。当执行多个线程时,程序员将选择连接池设置或多个语句。市场上大多数数据库可以在一个连接中处理多个语句。

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多