我正确使用Java PooledConnections吗?

我想使用与Java的池连接(因为每个线程创建一个连接的成本MysqlConnectionPoolDataSource() )所以我使用的是MysqlConnectionPoolDataSource()对象。 我在线程中持久化我的数据源。 所以,我只在整个应用程序中使用一个数据源,如下所示:

  startRegistry(); // creates an RMI registry for MySQL MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); dataSource.setUser("username"); dataSource.setPassword("password"); dataSource.setServerName("serverIP"); dataSource.setPort(3306); dataSource.setDatabaseName("dbname"); InitialContext context = createContext(); // Creates a context context.rebind("MySQLDS", dataSource); 

现在我已经创建了数据源,我在每个单独的线程中执行以下操作:

  PooledConnection connect = dataSource.getPooledConnection(); Connection sqlConnection = connect.getConnection(); Statement state = sqlConnection.createStatement(); ResultSet result = state.executeQuery("select * from someTable"); // Continue processing results 

我想我困惑的是对dataSource.getPooledConnection();的调用dataSource.getPooledConnection();
这真的是一个汇集连接吗? 这个线程安全吗? 我注意到PooledConnection有像notify()和wait()这样的方法……这意味着我不认为它正在做我认为它正在做的事情……

此外,何时以及如何释放连接?

我想知道滚动自己是否更有益,因为那时我会更熟悉一切,但我真的不想在这种情况下重新发明轮子:)。

谢谢你

这不是正确的方法。 数据源需要由运行应用程序的任何容器管理MysqlConnectionPoolDataSource 不是连接池。 它只是javax.sql.DataSource接口的具体实现。 您通常在JNDI上下文中定义它并从那里获取它。 MySQL本身也在其文档中明确说明了这一点。

现在,如何使用它取决于应用程序的目的。 如果它是Web应用程序,那么您需要引用相关servletcontainer / appserver的JNDI资源文档。 如果它是例如Tomcat,那么你可以在这里找到它。 如果您正在运行客户端应用程序 – 我会高度质疑连接池的价值 – 那么您需要寻找一个连接池框架,它可以利用MySQL提供的连接池数据源,例如C3P0 。

您发布的代码的另一个问题是PooledConnection#getConnection()将返回底层连接,因此不是池连接。 在它上面调用close将不会返回到池的连接,但只是关闭它。 池必须每次都创建一个新连接。

然后是线程安全故事,这取决于所讨论的真实连接池框架。 C3P0已经certificate了它多年来的稳健性,只要您按照标准习惯编写JDBC代码就可以担心它,即使用JDBC接口并在尽可能短的范围内获取关闭所有资源( ConnectionStatementResultSet ) 。