与Oracle

时间:2017-03-14 15:45:04

标签: oracle jdbc connection-pooling

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

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

但是JDBC 4.2 specification说:

  

13.1.1创建语句

     

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

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

4 个答案:

答案 0 :(得分:1)

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

连接可以同时打开多个语句和/或结果集,但一次只能执行一个。连接严格是单线程和阻塞。我们试图阻止多个线程同时访问Connection,但有一些奇怪的情况是可能的。这些都可以保证会引起问题。 (由于性能原因,修复或阻止这些情况是不切实际的。只是不要在多个线程之间共享一个连接。)

答案 1 :(得分:0)

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

这是documented here

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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