2012-11-30 119 views
0

如果我将相同的连接分配给仅执行select语句(无CRUD)的多个线程,此场景线程安全吗?每个线程从相同的连接创建它自己的预备语句并执行它。 尽管看起来线程安全,因为每个线程都处理自己的结果集实例并准备好了语句对象,但它们仍然使用与数据库相同的连接。我对Oracle JDBC驱动程序行为特别感兴趣。 预先感谢您。仅针对选定案例的多线程JDBC访问连接

回答

2

我Google artound,发现这个:

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

“Oracle的JDBC驱动程序提供了全面支持,并经过高度优化,使用Java多线程的应用程序,控制对连接的串行访问(例如连接缓存提供的连接访问)是必要和鼓励的,但Oracle强烈建议不要在多个线程之间共享数据库连接,避免允许多个线程同时访问连接如果多线程mus t共享连接,使用严格的开始使用/最终使用协议。“

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

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

--edit

如果你担心到服务器的连接数看看“Oracle连接mananger”

“Oracle连接管理器,大量用户连接到一个单一的服务器充当连接集中器,通过单个网络连接“汇集”多个客户端数据库会话。“

1

我相当肯定,jdbc规范要求连接线程安全(但不是语句/结果集),所以这将工作。但是,一些jdbc驱动程序实现对共享连接的效率较低,所以您应该明确测试您是否获得了不错的性能。如果没有,您可能需要切换到多个连接。

+1

微软是肯定的。这让我们其他开发者中的一位在这里感到紧张,但MS文档却说这很好,我一直在做这件事,没有任何问题。 Oracle的文档让我质疑它,但听起来或许它们只是谨小慎微。 –

4

Oracle文档不禁止多线程访问。相反,他们允许使用“如果多个线程必须共享一个连接,使用严格的开始使用/最终使用协议”。

我认为这种谨慎的原因可能是有问题的情况下,当一个线程插入/更新和提交/ rollsback而其他线程也插入/更新它自己的数据和问题提交或回滚

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

行为未定义为“只选”的情况。