我手头一个项目的Dao层的代码,Dao维持自己一个单例,Dao的操作方法是非线程安全的,每个方法内创建并销毁DB Connection,如
public class UserDao extends AbstractDAO {
private static Logger log = LoggerFactory.getLogger(ActivityDAO.class);
public static synchronized UserDao getInstance() {
if (instance == null) {
log.debug("getInstance()");
instance = new UserDao();
}
return instance;
}
public Connection getConnection() throws SQLException {
Connection con = null;
if (ds == null) {
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
ds = (DataSource) envContext.lookup(getDataSourceName());
ctx.close();
}
con = ds.getConnection();
} public void create(UserBean user) throws SQLException {
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection();
...
...
} finally {
closeStatement(stmt);
closeConnection(con);
}
}
} 我的问题是Dao是单例,所有Dao的方法没有synchronized不是线程安全的,当多个线程同时调用create方法时会不会出问题,比如con会不会冲突,会不会一个线程把con释放后另一个线程空指针了。
如果这么写没有问题的话,当Dao的上层要控制事务,con由Dao的上层当做参数传进来,上层控制con的创建和关闭,会有线程安全的问题么?
public class UserDao extends AbstractDAO {
private static Logger log = LoggerFactory.getLogger(ActivityDAO.class);
public static synchronized UserDao getInstance() {
if (instance == null) {
log.debug("getInstance()");
instance = new UserDao();
}
return instance;
}
public Connection getConnection() throws SQLException {
Connection con = null;
if (ds == null) {
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
ds = (DataSource) envContext.lookup(getDataSourceName());
ctx.close();
}
con = ds.getConnection();
} public void create(UserBean user) throws SQLException {
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection();
...
...
} finally {
closeStatement(stmt);
closeConnection(con);
}
}
} 我的问题是Dao是单例,所有Dao的方法没有synchronized不是线程安全的,当多个线程同时调用create方法时会不会出问题,比如con会不会冲突,会不会一个线程把con释放后另一个线程空指针了。
如果这么写没有问题的话,当Dao的上层要控制事务,con由Dao的上层当做参数传进来,上层控制con的创建和关闭,会有线程安全的问题么?
你这个DAO性能也有问题,每次调用create方法都要 lookup datasource,为何不把 datasource cache 起来?
我觉得在dao处理事务好像不好列,如果一个事务有多个步骤,每次都提交不是很麻烦啊?