如果我将相同的连接分配给只执行select语句(没有CRUD)的多个线程,这个场景线程是否安全?每个线程从同一个连接创建自己的预备语句并执行它。 虽然看起来线程安全,因为每个线程都运行自己的结果集和预处理语句对象的实例,但它们仍然使用与数据库相同的连接。我对Oracle JDBC驱动程序行为特别感兴趣。 先感谢您。
答案 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的效率较低,因此您一定要测试是否获得了不错的性能。如果没有,您可能需要切换到多个连接。