仅针对选择案例的多线程访问JDBC连接

时间:2012-11-30 13:05:30

标签: java multithreading oracle jdbc prepared-statement

如果我将相同的连接分配给只执行select语句(没有CRUD)的多个线程,这个场景线程是否安全?每个线程从同一个连接创建自己的预备语句并执行它。 虽然看起来线程安全,因为每个线程都运行自己的结果集和预处理语句对象的实例,但它们仍然使用与数据库相同的连接。我对Oracle JDBC驱动程序行为特别感兴趣。 先感谢您。

3 个答案:

答案 0 :(得分:4)

Oracle docs不禁止多线程访问。相反,他们允许使用语句“如果多个线程必须共享连接,请使用规范的开始使用/结束使用协议。”

我认为这种谨慎可能是由于一个线程插入/更新和提交/回滚时出现问题,而另一个线程也插入/更新自己的数据并发出提交或回滚

但是,在原始海报的情况下,所有线程只发出select语句...仍然resultset.next()将前往数据库以使用相同的tcp / ip流检索行到数据库...这是哪里混乱开始......

对于“仅限选择”的情况,行为未定义。

答案 1 :(得分:2)

我用Google搜索了一下,发现了这个:

  

“Oracle®数据库JDBC开发人员指南和参考”   JDBC和多线程

     

“Oracle JDBC驱动程序为使用Java多线程的应用程序提供全面支持并进行了高度优化。对连接的受控串行访问(例如连接缓存提供的连接)是必要和鼓励的。但是,Oracle强烈支持不鼓励在多个线程之间共享数据库连接。避免允许多个线程同时访问连接。如果多个线程必须共享连接,请使用规范的开始使用/结束使用协议。“

另外请记住,当您更新数据库时,您需要从更新连接中读取事务隔离才能正常工作。

据我所知,从池中获取连接是一个相对便宜的过程。

- 编辑

如果您担心与服务器的连接数量,请查看“Oracle connection mananger”

“Oracle Connection Manager通过充当连接集中器,允许大量用户连接到单个服务器,以通过单个网络连接”汇集“多个客户端数据库会话。”

答案 2 :(得分:1)

我非常确定jdbc规范要求Connections是线程安全的(但不是Statements / ResultSets),所以这将起作用。但是,某些jdbc驱动程序实现对共享Connections的效率较低,因此您一定要测试是否获得了不错的性能。如果没有,您可能需要切换到多个连接。