0

关于并发的问题。想象一下,来自世界各地 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();    
    }    

}   
4

1 回答 1

0

我实际上正在实现与您在这里非常相似的东西,这就是我实现它的方式: 请在此处查看我的答案

尽管我的设计中有一些元素需要根据BalusC 的这个答案进行更改,例如将我的 Logger 实例移动到 doGet 中,因为我的 Logger 本质上不是线程安全的设计。然而,我的 DBEngine 是为支持并发而设计的,它大量使用了 PostgresQL 的自然行级锁定。

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

于 2014-04-12T17:16:20.367 回答