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

时间:2013-09-24 15:44:16

标签: java mysql multithreading servlets database-connection

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,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?有什么方法可以避免这种问题吗?

3 个答案:

答案 0 :(得分:5)

  

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

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

  

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

除了天气你可以创建一个connection之类的,Servlet实例成员不是thread-safe.So当你在servelt中使用connection作为实例成员时,definitley你正在邀请问题。

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