2013-09-24 41 views
0
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root", "password"); 

比方說在Java中,我們可以通過上面的代碼創建一個mysql連接。從connection對象,我們可以創建幾個statement對象如下:Mysql是否在一個連接中同步執行語句?

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

首先,您將無法在字段初始化中使用'getConnection'。其次,使用連接池併爲每個連接創建和使用一個語句。 –

+0

@SotiriosDelimanolis即使你這樣做,OP的方法也不對。 –

+0

@LuiggiMendoza在什麼意義上? –

回答

5

因爲我所知道的是,在MySQL的一個連接將作爲一個線程來處理,所以我的想法是,由該連接創建的所有報表將在其隊列調度。

你應該不是保持數據庫連接對數據庫開放。您應該使用像Apache's DBCP這樣的連接池並獲得連接,執行查詢或其他SQL,然後釋放連接到池。

如果有多個用戶同時連接到servlet,它們會互相阻塞,因爲語句不能同時並行執行嗎?那麼,他們必須等待之前的陳述完成執行才能輪到他們呢?

沒錯。如果您有一個用戶正在進行數據庫事務,則另一個線程不能同時使用與數據庫相同的連接。

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

呀,你應該創建作爲一個字段到Servlet類這樣的連接。它將打開一個到數據庫的TCP連接並在應用程序的整個生命週期中保持它。由於網絡問題,這些連接有時會超時或關閉,因此需要保持活動狀態並偶爾重新打開。所有這些都由DBCP或其他連接池處理。

+0

+1。國際海事組織將改變*不應該創建一個這樣的連接*爲*一定不*。 –

2

如果您正在使用多線程則每個線程都應該有自己的連接。如果線程共享連接,則它將成爲單線程應用程序,因爲線程無法同時工作。

0

除了天氣,你可以創建一個connection像與否,servlet實例成員當您使用connection它的servelt作爲實例成員不thread-safe.So,definitley您邀請的問題。

去一個連接池,併爲線程實例。

相關問題