cev*_*ing 0 java multithreading synchronization
我有一个在不同线程中使用的数据库对象:
import java.sql.Connection;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;
public class Database
{
private final PoolDataSource pool = PoolDataSourceFactory.getPoolDataSource();
protected Connection connect ()
{
synchronized (pool) { return pool.getConnection(); }
}
protected void disconnect (Connection connection)
{
synchronized (pool) { connection.close(); }
}
}
Run Code Online (Sandbox Code Playgroud)
是否有必要同步对pool成员的访问?或者是否足以避免显式同步?
如果需要同步,则代码将被破坏,因为没有必要调用disconnect以关闭连接.类中的某些代码可以connection.close()绕过同步调用.
通常,您不应使用互斥锁来保护对最终引用的访问.因为这种字段根据Java Memory Model安全发布.
在你的部分情况下,PoolDataSourceImpl(或PoolXADataSourceImpl)能够改变自己的状态throw方法getConnection()和connection.close();.所以你应该检查一下你的PoolDataSource的实现是一个线程安全的.因此,
Oracle®DatabaseJDBC Developer's Guide and Reference看起来像DataSource是线程安全的,但不是Connection.
Oracle JDBC驱动程序为使用Java多线程的应用程序提供全面支持,并对其进行了高度优化.对连接的受控串行访问(例如连接缓存提供的连接)是必要和鼓励的.但是,Oracle强烈反对在多个线程之间共享数据库连接.避免允许多个线程同时访问连接.如果多个线程必须共享连接,请使用规范的开始使用/结束使用协议.