0
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同时连接到,会不会因为语句不能同时并行执行而互相阻塞?那么,他们必须等待前一个语句完成执行才能轮到他们吗?有什么办法可以避免这种问题?

4

3 回答 3

5

因为我所知道的是,mysql 中的一个连接将作为一个线程处理,所以我的想法是,由该连接创建的所有语句都将在其队列中调度。

您不应该保持对数据库打开的数据库连接。您应该使用Apache 的 DBCP 之类的连接池并获取连接,执行您的查询或其他 SQL,然后释放与池的连接。

如果有多个用户同时连接到 servlet,他们会不会因为语句不能同时并行执行而相互阻塞?那么,他们必须等待前一个语句完成执行才能轮到他们吗?

正确的。如果您有一个用户进行数据库事务,则另一个线程不能同时使用与数据库的相同连接。

public class HelloServlet extends HttpServlet {
     Connection connection = DriverManager.getConnection("j...");  

是的,您不应该像这样创建连接作为您的 servlet 类的字段。它将打开一个到数据库的 TCP 连接,并在应用程序的整个生命周期中保持它。这些连接有时会超时或由于网络问题而关闭,因此需要保持活动状态并有时重新打开。所有这些都由 DBCP 或其他连接池处理。

于 2013-09-24T15:48:22.907 回答
2

如果您使用的是多线程,那么每个线程都应该有自己的连接。如果线程共享连接,那么它将成为单线程应用程序,因为线程将无法同时工作。

于 2013-09-24T15:45:06.397 回答
0

除了天气你是否能够创建一个connection类似的,Servlet 实例成员不是线程安全的。所以当你connection在servelt 中使用它作为实例成员时,definitley 你是在邀请问题。

去一个连接池,并为线程创建一个实例。

于 2013-09-24T15:50:02.550 回答