Jdbc servlet中的并发问题
关于并发性的问题。想象一下,来自世界各地10个不同用户的10个不同的doGet()请求在毫秒内被调用到一个名为LoginServlet.java的servlet。在servlet的doGet()方法中是对DbUtil.getConnection()的调用。DBUtil类是静态的,getConnection()方法也是静态的。这里发生了什么?可能的竞赛条件、并发问题等是什么?连接之间会有损坏吗?是否有更好的连接池设计替代方案 只要想象一下LoginServlet.java正在做这样的事情Jdbc servlet中的并发问题,jdbc,Jdbc,关于并发性的问题。想象一下,来自世界各地10个不同用户的10个不同的doGet()请求在毫秒内被调用到一个名为LoginServlet.java的servlet。在servlet的doGet()方法中是对DbUtil.getConnection()的调用。DBUtil类是静态的,getConnection()方法也是静态的。这里发生了什么?可能的竞赛条件、并发问题等是什么?连接之间会有损坏吗?是否有更好的连接池设计替代方案 只要想象一下LoginServlet.java正在做这样的事情 @Web
@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();
}
}
实际上,我正在实现一些与您在这里实现的非常类似的东西,我就是这样实现的: 尽管在我的设计中有一些元素需要根据更改,例如将我的记录器实例化移动到doGet中,因为我的记录器本质上不是线程安全的设计。然而,我的DBEngine是为支持并发而设计的,它大量使用了PostgresQL的自然行级锁定 可悲的是,我还没有完全完成这个项目,所以我不能确切地说出要避免哪些陷阱,但我将能够在几个月内扩展这个答案。但这会让你对我在这个主题上的研究有一个很好的了解