併發問題。想象一下,來自世界各地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();
}
}