java 方法重用,与线程安全讨论

来源:百度知道 编辑:UC知道 时间:2024/07/05 07:31:30
问题如下
比如我有几个jdbc查询的方法,他们的参数或作用不同,

但是我在设置了PreparedStatement以后,下面的代码都是一样的,我想把这部分代码提出来写成一个方法,这样其它几个方法就都可以重用这个方法,但是我担心这样做是不安全的,原因是因为 dao可能在action里是全局的,并且action可能是单例的,这样如果多个action里同时调用dao里面的方法是不是会引起方法里的变量会共享,导致一个正在用的值被另一个线程更改了,参生不安全.如果会产生这种情况,有什么解决方案
比如
class userDao{
queryUser(username){
..
PreparedStatement pstm = connection.prepareStatement(sqlString);
pstm.set(1,username);
return execute(pstm);
}
queryGroup(groupName)){
..
PreparedStatement pstm = connection.prepareStatement(sqlString);
pstm.set(1,groupName);
return execute(pstm);
}
execute(pstm){
..执行并封装到list中返回
}
}

方法里的局部变量不会共享的,多个线程调用同一个方法时都在内存中有独立的工作区,工作区的数据不能共享。

个人觉得不会

但是有个前提queryUser和queryGroup等等其他方法的connection是自身方法的局部变量,也就是说该方法要数据库连接,那么就在自身方法体里面去取得数据库连接,而不是调用userDao的实例变量

还有就是看你的事务是咋控制的

我觉得也不会.....

但我现在是这样用的...你可以参考下
public boolean password(UserInfo user){
boolean bool=false;
//Conn是单独的一个类,是用来开启/关闭连接的
Connection conn=Conn.getConnection();
String sql="select * from UserInfo where Username=? and Password=?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,user.getUsername());
pstmt.setString(2,user.getPassword());
ResultSet rs=pstmt.executeQuery();
bool=rs.next();
//Conn中关闭
Conn.close(rs,pstmt,conn);
} catch (SQLException ex) {
ex.printStackTrace();
}
return bool;