Java线程和MySQL

我有一个线程聊天服务器应用程序,需要MySQLvalidation。

让1个类创建MySQL连接,保持该连接打开并让每个线程使用该连接但使用自己的Query处理程序是最好的方法吗?

或者让所有线程与MySQL分开连接以进行身份​​validation更好?

或者让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(); } } 

}

这是线程安全吗?

你看过连接池吗? 检查(例如) Apache DBCP或C3P0 。

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

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

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

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

您的聊天应用应该在其域模型中有一些明智的对象。 我会根据需要为它们创建数据访问对象。 将与特定域模型对象相关的查询保留在其DAO中。

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