oracle.ucp.jdbc.PoolDataSource.getConnection()是否为线程安全方法?
多线程场景调用
oracle.ucp.jdbc.PoolDataSource.getConnection()的相关说明 核心结论
可以直接在多线程场景下调用该方法,getConnection()本身是线程安全的,不需要开发者额外做并发控制。
原理说明
Oracle UCP(通用连接池)在设计之初就默认支持多线程并发获取连接的场景,PoolDataSource的所有官方实现类都对连接池的核心操作做了线程安全处理:
- 连接池内部的可用连接队列、已分配连接计数、连接状态标记等核心数据结构都做了同步保护,多线程同时调用
getConnection()不会出现连接重复分配、池状态异常、空指针等并发问题 - 官方标准实现里已经针对高并发场景做了锁优化,自行在业务代码中对
getConnection()调用加锁反而会大幅降低连接池的吞吐性能
注意事项
这里的线程安全仅针对
getConnection()方法的调用过程,你从池里拿到的java.sql.Connection实例本身不是线程安全的,绝对不要把同一个Connection对象传给多个线程共享使用。每个线程应该独立从池里获取连接,使用完成后主动调用close()方法归还连接到池中,避免出现事务错乱、数据操作异常等问题。
内容的提问来源于stack exchange,提问作者Chandu
相关产品推荐
相关产品推荐

