2013-10-18 22 views
0

併發問題。想象一下,來自世界各地10個不同用戶的10個不同的doGet()請求在彼此的毫秒內調用到名爲LoginServlet.java的servlet。在servlet的doGet()方法內部是對DbUtil.getConnection()的調用。 DBUtil類是靜態的,方法getConnection()也是靜態的。這裏發生了什麼?什麼是可能的競爭條件,併發問題等等?連接之間會有腐敗嗎?連接池是否有更好的替代方案?servlet中的併發問題

只是照片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();  
    }  

} 

回答

0

我實際執行與你在這裏相當類似的東西,這是我如何實現它:See my answer here

雖然在我的設計需要根據this answer from BalusC改變幾個元素,比如在doGet中移動我的記錄器實例,因爲我的記錄器本質上不是線程安全的設計。但是,我的DBEngine旨在支持併發性,並且大量使用PostgresQL的自然行級鎖定。

不幸的是,我還沒有完全完成這個項目,所以我不能完全確定要避免哪些缺陷,但我可以在幾個月內擴展這個答案。但是這會給你一個關於這個話題的總結的好主意。