如果我将相同的连接分配给仅执行select语句(无CRUD)的多个线程,此场景线程安全吗?每个线程从相同的连接创建它自己的预备语句并执行它。 尽管看起来线程安全,因为每个线程都处理自己的结果集实例并准备好了语句对象,但它们仍然使用与数据库相同的连接。我对Oracle JDBC驱动程序行为特别感兴趣。 预先感谢您。仅针对选定案例的多线程JDBC访问连接
0
A
回答
2
我Google artound,发现这个:
“的Oracle®数据库JDBC开发人员指南和参考” JDBC和多线程
“Oracle的JDBC驱动程序提供了全面支持,并经过高度优化,使用Java多线程的应用程序,控制对连接的串行访问(例如连接缓存提供的连接访问)是必要和鼓励的,但Oracle强烈建议不要在多个线程之间共享数据库连接,避免允许多个线程同时访问连接如果多线程mus t共享连接,使用严格的开始使用/最终使用协议。“
还要记住,当您更新数据库时,您需要从更新连接中读取事务隔离才能正常工作。
据我所知,从一个池中获取连接是一个相对便宜的过程。
--edit
如果你担心到服务器的连接数看看“Oracle连接mananger”
“Oracle连接管理器,大量用户连接到一个单一的服务器充当连接集中器,通过单个网络连接“汇集”多个客户端数据库会话。“
1
我相当肯定,jdbc规范要求连接线程安全(但不是语句/结果集),所以这将工作。但是,一些jdbc驱动程序实现对共享连接的效率较低,所以您应该明确测试您是否获得了不错的性能。如果没有,您可能需要切换到多个连接。
4
Oracle文档不禁止多线程访问。相反,他们允许使用“如果多个线程必须共享一个连接,使用严格的开始使用/最终使用协议”。
我认为这种谨慎的原因可能是有问题的情况下,当一个线程插入/更新和提交/ rollsback而其他线程也插入/更新它自己的数据和问题提交或回滚
但是,在原海报的情况下,所有线程只发出select语句...仍然resultset.next()将前往数据库检索使用相同的tcp/ip流到数据库的行......这是混乱开始的地方...
行为未定义为“只选”的情况。
相关问题
- 1. 与选定案例连接
- 2. JDBC一对多连接与多选择
- 3. Android AsyncTask与针对特定案例的线程
- 4. 连接池vs每线程JDBC连接
- 5. 针对Servlets的JDBC连接池
- 6. Java - 针对mysql连接池的单例模式 - 连接太多
- 7. 访问的JDBC拒绝连接到MySQL
- 8. 通过每个线程的新连接实例的连接池(JDBC)
- 9. C#针对Firebird(.NET)的多线程数据库访问
- 10. Doctrine2 ORM访问多对多连接表
- 11. 针对JDBC驱动程序的MYSQL安装和连接查询
- 12. 多线程JDBC
- 13. 通过jOOQ事务访问JDBC连接
- 14. JDBC连接:访问被拒绝
- 15. RPyC serve_all阻止线程访问连接
- 16. 针对线程的chroot替代方案
- 17. 多线程访问多个对象
- 18. 连接和访问比例
- 19. JDBC连接问题
- 20. JDBC连接问题
- 21. JDBC连接问题
- 22. 对MapPoint的多线程访问?
- 23. SQL连接案例
- 24. JDBC连接接口对象
- 25. JDBC + Postgres的连接问题
- 26. 针对.net的桌面多线程UI示例应用程序
- 27. 直接访问多对多连接表的任何好理由?
- 28. 错误访问多线程程序中的文件指针
- 29. 仅针对指定元素的问题
- 30. jdbc驱动程序连接问题(sun.jdbc.odbc.JdbcOdbcDriver)
微软是肯定的。这让我们其他开发者中的一位在这里感到紧张,但MS文档却说这很好,我一直在做这件事,没有任何问题。 Oracle的文档让我质疑它,但听起来或许它们只是谨小慎微。 –