2010-01-30 41 views
1

我有一個線程聊天服務器應用程序,它需要MySQL授權。Java線程和MySQL

讓1個類創建MySQL連接,保持該連接處於打開狀態並讓每個線程都使用該連接但使用自己的Query處理程序的最佳方法是?

或者讓所有線程與MySQL進行獨立連接來驗證是否更好?

還是讓1個類處理查詢和連接更好?

我們正在尋找一個聊天服務器,該服務器應該能夠處理高達10.000個連接/用戶。


我現在用C3P0,和我創建了這一點:

public static void main(String[] args) throws PropertyVetoException 
{ 
    ComboPooledDataSource pool = new ComboPooledDataSource(); 
    pool.setDriverClass("com.mysql.jdbc.Driver"); 
    pool.setJdbcUrl("jdbc:mysql://localhost:3306/db"); 
    pool.setUser("root"); 
    pool.setPassword("pw"); 
    pool.setMaxPoolSize(100); 
    pool.setMinPoolSize(10); 

    Database database = new Database(pool); 
    try 
    { 

     ResultSet rs = database.query("SELECT * FROM `users`"); 

     while (rs.next()) { 
      System.out.println(rs.getString("userid")); 
      System.out.println(rs.getString("username")); 
     } 
    } 
    catch(Exception ex) 
    { 
     System.out.println(ex.getMessage()); 
    } 
    finally 
    { 
     database.close(); 
    } 

}

公共類數據庫{

ComboPooledDataSource pool; 
Connection conn; 
ResultSet rs = null; 
Statement st = null; 

public Database (ComboPooledDataSource p_pool) 
{ 
    pool = p_pool; 
} 

public ResultSet query (String _query) 
{ 
    try { 
     conn = pool.getConnection(); 
     st = conn.createStatement(); 
     rs = st.executeQuery(_query); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 

    } 
    return rs; 
} 

public void close() 
{ 
    try { 
     st.close(); 
     conn.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

}

這會是線程安全?

回答

1

你看過連接池嗎?退房(例如)Apache DBCPC3P0

簡而言之,連接池意味着使用已認證的連接池,並根據請求將自由連接傳遞給您。您可以根據需要配置連接數。當你關閉一個連接時,它實際上會返回到池中,並可供其他客戶端使用。在您的場景中,它使生活變得相對容易,因爲池會關注身份驗證和連接管理。

+0

謝謝,我一定會研究這個,看起來像正確的解決方案。 – YesMan85 2010-01-30 12:45:33

+0

DBCP是單線程的。他明確要求在多線程環境下進行連接。我寧願去c3p0。 – BalusC 2010-01-30 14:25:25

+0

我不確定我在DBCP中看到任何內容,表明您不能在多線程環境中使用它。你能詳細說明嗎? – 2010-01-30 14:49:56

2

c3p0 connection pool是一個強大的解決方案。您也可以檢查dbcp,但c3p0顯示更好的性能,支持自動重新連接和一些其他功能。

+0

..它是多線程的。 – BalusC 2010-01-30 14:26:37

1

你不應該只有一個連接。這不是一個線程安全的類。這個想法是獲得連接,使用它,並在儘可能最窄的範圍內關閉它。

是的,你需要一個池。每個Java EE應用服務器都會爲您提供一個JNDI池機制。我也不會爲所有查詢推薦一個類。您的聊天ap

您的聊天應用在其域模型中應該有幾個明智的對象。我會爲它們創建適當的數據訪問對象。將與特定域模型對象相關的查詢保留在其DAO中。