【问题标题】:Does Mysql execute statement synchronously in one connection?Mysql是否在一个连接中同步执行语句?
【发布时间】: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


【解决方案1】:

因为我知道,mysql中的一个连接会被当作一个线程来处理,所以我的想法是,这个连接创建的所有语句都会在它的队列中调度。

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

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

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

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

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

【讨论】:

  • +1。 IMO 会将不应创建这样的连接更改为不得
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    除了天气你是否可以创建一个connection,Servlet 实例成员不是线程安全的。所以当你在servelt 中使用connection 作为实例成员时,definitley 你是在招惹问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2012-11-15
      相关资源
      最近更新 更多