2010-01-30 1 views
1

У меня есть приложение для чата с часами, которое требует аутентификации MySQL.Java Threads и MySQL

Лучший способ иметь 1 класс создать соединение MySQL, открыть это соединение и позволить каждому потоку использовать это соединение, но использовать собственный обработчик запросов?

Или лучше, чтобы все потоки обеспечивали отдельное соединение с 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(); 
    } 

}

общественного класса Database {

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 DBCP или C3P0.

Вкратце, объединение пулов означает, что используется пул аутентифицированных подключений, и по запросу предоставляются бесплатные соединения. Вы можете настроить количество подключений по мере необходимости. Когда вы закрываете соединение, оно фактически возвращается в пул и становится доступным для другого клиента. Это делает жизнь относительно легкой в ​​вашем сценарии, так как пул смотрит за управлением аутентификацией и подключением.

+0

Спасибо, я обязательно посмотрю на это, это похоже на правильное решение. – YesMan85

+0

DBCP - односторонний. Он явно просил подключиться в многопоточном контексте. Я бы предпочел пойти на c3p0. – BalusC

+0

Я не уверен, что я вижу что-либо в DBCP, чтобы указать, что вы не можете использовать его в многопоточном контексте. Можете ли вы уточнить? –

2

c3p0 connection pool - надежное решение. Вы также можете проверить dbcp, но c3p0 показывает лучшую производительность, поддерживает автоматическое пересоединение и некоторые другие функции.

+0

..и многопоточность. – BalusC

1

У вас не должно быть только одного соединения. Это не класс, защищенный потоками. Идея состоит в том, чтобы получить соединение, использовать его и закрыть его в самом узком объеме.

Да, вам понадобится пул из них. Каждый сервер приложений Java EE будет иметь для вас механизм объединения JNDI. Я бы не рекомендовал один класс для всех запросов. Ваш чат ap

Ваше приложение для чата должно иметь несколько разумных объектов в своей модели домена. Я бы создал для них объекты доступа к данным. Сохранять запросы, связанные с конкретным объектом модели домена, в DAO.