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它们,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?有什么方法可以避免这种问题吗?
因为我所知道的是,mysql中的一个连接将作为一个线程处理,所以我的想法是,该连接创建的所有语句都将在其队列中进行调度.
你应该不抱一个数据库连接打开数据库.您应该使用Apache的DBCP之类的连接池并获取连接,执行查询或其他SQL,然后释放与池的连接.
如果有多个用户同时连接到servlet,它们是否会相互阻塞,因为该语句不能同时并行执行?那么,他们必须在轮到他们之前等待之前的声明完成执行?
对.如果您有一个用户进行数据库事务,则另一个线程不能同时使用与数据库相同的连接.
public class HelloServlet extends HttpServlet {
Connection connection = DriverManager.getConnection("j...");
Run Code Online (Sandbox Code Playgroud)
是的,你不应该像这样创建一个连接作为servlet类的字段.它将打开与数据库的TCP连接,并在应用程序的生命周期内保留它.由于网络问题,这些连接有时会超时或关闭,因此需要保持活动状态,有时需要重新打开.所有这些都由DBCP或其他连接池处理.
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |