Потоки Java и MySQL - PullRequest
       6

Потоки Java и MySQL

2 голосов
/ 30 января 2010

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

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

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

}

Будет ли это потокобезопасным?

Ответы [ 4 ]

2 голосов
/ 30 января 2010

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

1 голос
/ 30 января 2010

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

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

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

1 голос
/ 30 января 2010

Вы смотрели на пул соединений? Проверьте (например) Apache DBCP или C3P0 .

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

0 голосов
/ 12 марта 2012

актуальна ли информация в этой теме? Гугл поднимает много разных вещей, а также это - http://dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...