private int insertOrUpdate(String sql, Object[] params) {
Connection conn = getConection();
PreparedStatement pstmt = null;
int i = 0;
try { boolean ac = conn.getAutoCommit();
if (ac) {
conn.setAutoCommit(false);
}
pstmt = conn.prepareStatement(sql);
for (int j = 0; j < params.length; j++) {
pstmt.setObject(j + 1, params[j]);
}
i = pstmt.executeUpdate(); if (null == tb.get() || !tb.get()) {
conn.commit();
} } catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e.printStackTrace();
}
e.printStackTrace();
} finally {
close(pstmt);
if (null == tb.get() || !tb.get()) {
close(conn);
//System.out.println("close connection!");
}
}
return i;
}此方法是一个单例类的方法 这个方法中Connection 已经用ThreadLocal改造成安全的了,想问一下这个方法中PreparedStatement pstmt 是否是安全的?

解决方案 »

  1.   

    这个跟你的类是否是单列无关,你在方法内每次都创建一个新的connection,然后关闭这个connection,所以你的connection是线程专有的,pstmt应该是线程安全的,但是这样的做法有个缺点,就是程序执行效率很差。
      

  2.   

    同意1楼的看法。关键是那个getConection()方法,可能是从DataSource里面取到的实现的,所以用户不用关心Connection是怎么来的。然后这个Connection又是local变量,而PreparedStatement又是从Connection里面取出来的,所以没必要synchronized。
      

  3.   

    getConection()方法返回的是和当前纯种绑定的Connection,用ThreadLocal实现的。