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