【发布时间】:2013-09-24 15:44:16
【问题描述】:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root", "password");
假设在 Java 中,我们可以通过上面的代码创建一个 mysql 连接。从connection 对象,我们可以创建几个statement 对象,如下所示:
statement = connection.createStatement();
我想知道,如果我们在不同的线程中执行那些statement对象(通过调用statement.executeQuery),它们在Mysql数据库中是同步执行还是异步执行?因为我所知道的是,mysql 中的一个连接将作为一个线程处理,所以我的想法是,由该连接创建的所有语句都将在其队列中调度。我对么?
所以,如果我有一个servlet,如下所示:
public class HelloServlet extends HttpServlet {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root", "password");
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
statement = connection.createStatement();
}
}
从上面的代码来看,如果有多个用户同时连接到servlet,会不会因为语句不能同时并行执行而互相阻塞?那么,他们必须等待前一个语句完成执行才能轮到他们吗?有什么办法可以避免这种问题?
【问题讨论】:
-
首先,您将无法在字段初始化中使用
getConnection。其次,使用连接池,每个连接创建和使用一条语句。 -
@SotiriosDelimanolis 即使您这样做,OP 的方法也不正确。
-
@LuiggiMendoza 在什么意义上?
-
@SotiriosDelimanolis 是的,我同意那部分,但
Connection不得是 Servlet 的字段,而是必要方法中的局部变量(甚至在doGet也不是doPost方法 =\)。 -
@GMsoF 试试看。
DriverManager#getConnection()被声明为抛出SQLException。默认的无参数构造函数无法处理抛出的检查异常。
标签: java mysql multithreading servlets database-connection