【问题标题】:Java Threads and MySQLJava 线程和 MySQL
【发布时间】:2011-01-11 04:31:25
【问题描述】:

我有一个需要 MySQL 身份验证的线程聊天服务器应用程序。

让 1 个类创建 MySQL 连接、保持该连接打开并让每个线程使用该连接但使用自己的查询处理程序的最佳方法是什么?

还是让所有线程单独连接到 MySQL 以进行身份​​验证更好?

还是让 1 个类处理查询和连接更好?

我们正在寻找一个能够处理多达 10000 个连接/用户的聊天服务器。


我现在使用 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();
    }
}

}

这会是线程安全的吗?

【问题讨论】:

    标签: java mysql multithreading chat


    【解决方案1】:

    c3p0 connection pool 是一个强大的解决方案。您也可以检查 dbcp,但 c3p0 显示更好的性能,支持自动重新连接和一些其他功能。

    【讨论】:

      【解决方案2】:

      你看过连接池吗?查看(例如)Apache DBCPC3P0

      简而言之,连接池意味着使用经过身份验证的连接池,并根据请求将免费连接传递给您。您可以根据需要配置连接数。当您关闭连接时,它实际上会返回到池中并可供另一个客户端使用。由于池负责身份验证和连接管理,因此在您的场景中工作相对容易。

      【讨论】:

      • 谢谢,我一定会调查的,这看起来是正确的解决方案。
      • DBCP 是单线程的。他明确要求在多线程上下文中进行连接。我宁愿选择 c3p0。
      • 我不确定我在 DBCP 中看到的任何内容表明您不能在多线程上下文中使用它。能详细点吗?
      • 附言。 DBCP 仅作为示例,而不是本身的建议。但它肯定没有正确阅读,所以我进行了适当的编辑。
      • 您可以在多线程上下文中使用它,但连接池本身是同步的,因此对于多线程上下文中的性能而言并不是真正的最佳选择。
      【解决方案3】:

      您不应该只有一个连接。它不是线程安全的类。这个想法是获得一个连接,使用它,并在尽可能窄的范围内关闭它。

      是的,您需要一个池。每个 Java EE 应用程序服务器都会为您提供 JNDI 池机制。我也不会为所有查询推荐一门课。你的聊天应用

      您的聊天应用程序应该在其域模型中包含一些合理的对象。我会酌情为它们创建数据访问对象。将与特定域模型对象相关的查询保存在其 DAO 中。

      【讨论】:

        【解决方案4】:

        这个帖子中的信息是最新的吗?谷歌搜索带来了很多不同的东西,还有这个 - http://dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html

        【讨论】:

          猜你喜欢
          • 2012-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 2016-08-02
          • 1970-01-01
          相关资源
          最近更新 更多