单例方法应该同步吗?
Should the singleton methods be synchronized?
我的网络应用程序(这里没有 Spring-MVC,只有核心 IOC)使用了很多原型 bean,其中大部分都使用了单例 dao-bean。是否应该同步单例 dao-bean 方法,因为许多不同的原型 bean(来自不同的请求)可能在同一时刻使用相同的方法 id dao?
比如dao方法
public void setLetterNotNew(int letterId) {
final String sql = "UPDATE income SET isnew=? WHERE id=?";
try( Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql); ) {
ps.setInt(1, 0);
ps.setInt(2, letterId);
int i = ps.executeUpdate();
if(i==0) throw new SQLException("setLetterNotNew");
} catch (SQLException e) {
log.error(e);
}
}
视情况而定。
正如您在评论中所写,您使用 jdbc。 JDBC API are synchronized and do auto-commit by default 上的所有操作。因此,如果您共享 JDBC 连接,但您的方法不需要事务(例如,它不需要更新几行之前选择的数据),则不需要同步。
但是,如果您需要事务,则必须同步此方法或为每个线程提供自己的 JDBC 连接,如 each connection is also a transaction. To achieve that you could open new connection each time in a method or let Spring handle that problem
我的网络应用程序(这里没有 Spring-MVC,只有核心 IOC)使用了很多原型 bean,其中大部分都使用了单例 dao-bean。是否应该同步单例 dao-bean 方法,因为许多不同的原型 bean(来自不同的请求)可能在同一时刻使用相同的方法 id dao?
比如dao方法
public void setLetterNotNew(int letterId) {
final String sql = "UPDATE income SET isnew=? WHERE id=?";
try( Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql); ) {
ps.setInt(1, 0);
ps.setInt(2, letterId);
int i = ps.executeUpdate();
if(i==0) throw new SQLException("setLetterNotNew");
} catch (SQLException e) {
log.error(e);
}
}
视情况而定。
正如您在评论中所写,您使用 jdbc。 JDBC API are synchronized and do auto-commit by default 上的所有操作。因此,如果您共享 JDBC 连接,但您的方法不需要事务(例如,它不需要更新几行之前选择的数据),则不需要同步。
但是,如果您需要事务,则必须同步此方法或为每个线程提供自己的 JDBC 连接,如 each connection is also a transaction. To achieve that you could open new connection each time in a method or let Spring handle that problem