首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

第一次发帖,一个关于servlet使用数据源的多线程安全性有关问题

2012-03-27 
第一次发帖,一个关于servlet使用数据源的多线程安全性问题public class UserDaoImpl implements UserDAO {

第一次发帖,一个关于servlet使用数据源的多线程安全性问题
public class UserDaoImpl implements UserDAO {
/** 日志实例 */
private Logger logger = Logger.getLogger("UserDaoImpl");
/** 数据源实例 */
private DataSource ds = null;

private static UserDaoImpl userDaoImpl = null;

public static UserDaoImpl getInstance() {

userDaoImpl = new UserDaoImpl();
return userDaoImpl;
}

private UserDaoImpl() {

initDataSource();
}

public void initDataSource() {

try {

Context initialContext = new InitialContext();
Context evoContext = (Context)initialContext.lookup("java:/comp/evo");
ds = (DataSource)evoContext.lookup("java/ums");
} catch (NamingException e) {

logger.log(Level.INFO, "数据源初始化失败!");
e.printStackTrace();
}
}

/////////////////////////////主要方法////////////////////////////////////////////

@Override
public boolean addUser(User user) {

Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
String sql = null;

int rowCount = -1;//数据库改变的行号,初始化为-1

try {
conn = ds.getConnection();

sql = "INSERT INTO userinfo VALUES(?, ?, ?, ?, ?)";

preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, user.getUserId());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setString(3, user.getUserName());
preparedStatement.setString(4, user.getUserCode());
preparedStatement.setString(5, user.getEmail());

rowCount = preparedStatement.executeUpdate(sql);

preparedStatement.close();
preparedStatement = null;

conn.close();
conn = null;
} catch (SQLException e) {

logger.log(Level.INFO, "添加用户操作异常!");
e.printStackTrace();
} finally {

try {
if (rs != null) {

rs.close();
rs = null;
}
if (preparedStatement != null) {

preparedStatement.close();
preparedStatement = null;
}
if (conn != null) {

conn.close();
conn = null;
}
} catch (SQLException e) {

logger.log(Level.INFO, "数据库连接释放异常!");
e.printStackTrace();
}
}

if (rowCount == 0 || rowCount == -1) {

return false;
} else {

return true;
}
}

@Override
public List<User> findAll() {
.............(代码略,类似于adduser方法)


}

public boolean getUser(String userId) {

.............(代码略,类似于adduser方法)

}

servlet代码:

@SuppressWarnings("serial")
public class FrontController extends HttpServlet {

UserDAO userDao;

public void init() throws ServletException {

userDao = UserDaoImpl.getInstance();
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

System.out.println("get");

doPost(request, response);//将请求交由doPost()处理
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

System.out.println("post");

String action = request.getParameter("action");//获得用户请求的动作

if ("login".equals(action)) {

login(request, response);
} else if ("register".equals(action)) {

register(request, response);
} else if ("logout".equals(action)) {

logout(request, response);


} else {

response.sendError(404);
}
}

public void login(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {

。。。。。。。

  userDao.getUser();

  。。。。。。。
}

public void register(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {



。。。。。。(代码略)
   
  userDao.addUser(user);

。。。。。。(代码略)

}
public void logout(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {

。。。。。。(代码略)
}
}

想问一下 这样会不会有多线程安全的问题?


[解决办法]
肯定会有问题,你在servlet中把userdao定义为一个成员变量,如果把这个变量变为一个局部变量,也就是放到dopost中就不会有问题了!

热点排行