Mysql是否在一个连接中同步执行语句?

GMs*_*soF 0 java mysql multithreading servlets database-connection

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root", "password");
Run Code Online (Sandbox Code Playgroud)

让我们说在Java中,我们可以通过上面的代码创建一个mysql连接.从connection对象中,我们可以创建几个statement对象,如下所示:

statement = connection.createStatement();
Run Code Online (Sandbox Code Playgroud)

我想知道,如果我们在不同的线程中执行那些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();
   }
}
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,如果有多个用户同时连接到servlet它们,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?有什么方法可以避免这种问题吗?

Gra*_*ray 5

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

你应该抱一个数据库连接打开数据库.您应该使用Apache的DBCP之类的连接池并获取连接,执行查询或其他SQL,然后释放与池的连接.

如果有多个用户同时连接到servlet,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?

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

public class HelloServlet extends HttpServlet {
     Connection connection = DriverManager.getConnection("j...");  
Run Code Online (Sandbox Code Playgroud)

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