首先有个目标为 /* 的过滤器。public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response); //servlet--service--dao
DBManager.CommitTransaction();
}finally{
DBManager.closeConn();
}
}并且有个数据库的工具类。public class DBManager {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
private static DataSource ds;
static {
ds =new ComboPooledDataSource();
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection(){
try{
Connection conn =tl.get();
if(conn==null){
conn =ds.getConnection();
conn.setAutoCommit(false);
tl.set(conn);
}
return conn;
}catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void StartTransaction(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void CommitTransaction(){
try {
Connection conn = getConnection();
if(conn!=null){
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void closeConn(){
Connection conn =null;
try {
conn =getConnection();
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
tl.remove();
}
}
}当我从某个链接点入到某个servlet的dealorder方法的时候会出现两个线程并发执行(我是这么认为的),导致存入数据库的数据会出现重复数据,这是怎么回事?????private void dealorder(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Cart cart = (Cart) request.getSession().getAttribute("cart");//购物车对象
//保存订单负责人和备注信息);
service.saveOrder(cart);//将购物车的对象中的数据保存在数据库中。
cart.removeAll();
} catch (Exception e) {
// TODO: handle exception
request.setAttribute("message", "订单生成失败");
}
request.setAttribute("message", "订单生成成功,请等待收货");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response); //servlet--service--dao
DBManager.CommitTransaction();
}finally{
DBManager.closeConn();
}
}并且有个数据库的工具类。public class DBManager {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
private static DataSource ds;
static {
ds =new ComboPooledDataSource();
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection(){
try{
Connection conn =tl.get();
if(conn==null){
conn =ds.getConnection();
conn.setAutoCommit(false);
tl.set(conn);
}
return conn;
}catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void StartTransaction(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void CommitTransaction(){
try {
Connection conn = getConnection();
if(conn!=null){
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void closeConn(){
Connection conn =null;
try {
conn =getConnection();
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
tl.remove();
}
}
}当我从某个链接点入到某个servlet的dealorder方法的时候会出现两个线程并发执行(我是这么认为的),导致存入数据库的数据会出现重复数据,这是怎么回事?????private void dealorder(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Cart cart = (Cart) request.getSession().getAttribute("cart");//购物车对象
//保存订单负责人和备注信息);
service.saveOrder(cart);//将购物车的对象中的数据保存在数据库中。
cart.removeAll();
} catch (Exception e) {
// TODO: handle exception
request.setAttribute("message", "订单生成失败");
}
request.setAttribute("message", "订单生成成功,请等待收货");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货