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
,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?有什么方法可以避免这种问题吗?
答案 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你正在邀请问题。
转到连接池,并为线程创建一个实例。