servlet中的并发问题

时间:2013-10-18 21:53:23

标签: jdbc

有关并发的问题。想象一下,来自世界各地的10个不同用户的10个不同的doGet()请求在一个名为LoginServlet.java的servlet之间相互之间相隔毫秒。在servlet的doGet()方法内部是对DbUtil.getConnection()的调用。 DBUtil类是静态的,方法getConnection()也是静态的。这里发生了什么?什么是可能的竞争条件,并发问题等等?连接之间是否存在腐败?这种连接池设计有更好的替代方案吗?

想象一下LoginServlet.java做这样的事情。

@WebServlet("/LoginServlet.secure")  
public class LoginServletextends HttpServlet {  
    private static final long serialVersionUID = 1L;  

    public LoginServlet() {  
        super();  
    }  

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        Connection connection = DbUtil.getConnection();  
    }  

这是获取连接的静态DBUtil类。

package util;    

import java.sql.Connection;    
import java.sql.SQLException;    

import javax.naming.InitialContext;    
import javax.naming.NamingException;    
import javax.sql.DataSource;    

public class DbUtil {    

    private static DataSource dataSource;    

    static {    
        try {    
            dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");    
        } catch (NamingException e) {     
            throw new ExceptionInInitializerError("'jdbc/MyDataSource' not found in JNDI");    
        }    
    }    

    public static Connection getConnection() throws SQLException {    
        return dataSource.getConnection();    
    }    

}   

1 个答案:

答案 0 :(得分:0)

我实际上正在实现与此处相似的内容,这就是我实现它的方式:See my answer here

虽然我的设计中有一些元素需要根据this answer from BalusC进行更改,例如在doGet中移动我的Logger实例化,因为我的Logger本身并不是线程安全的设计。但是,我的DBEngine旨在支持并发性,并且它大量使用PostgresQL的自然行级锁定。

可悲的是,我还没有完全完成这个项目,所以我无法确切地说明要避免哪些陷阱,但我将能够在几个月内扩展这个答案。但是这会让你对我对这个主题的研究总结有所了解。