我正确使用Java PooledConnections吗?

Pol*_*878 12 java mysql database multithreading

我想使用与Java的池连接(因为每个线程创建一个连接的成本很高)所以我正在使用该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);
Run Code Online (Sandbox Code Playgroud)

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

  PooledConnection connect = dataSource.getPooledConnection();
  Connection sqlConnection = connect.getConnection();

  Statement state = sqlConnection.createStatement();

  ResultSet result = state.executeQuery("select * from someTable");
  // Continue processing results
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢你

Bal*_*usC 15

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

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

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

然后是线程安全故事,这取决于所讨论的真实连接池框架.C3P0已经证明了它的坚固性在几年,你不只要你写根据标准成语JDBC代码,即用担心它在JDBC接口和收购,并关闭所有资源(Connection,StatementResultSet在最短的范围内).

  • @BalusC:我所说的没有任何改变 - 不需要有一个容器来汇集数据源。不需要,好吗?实际上什么容器并不重要 - 无论是 Servlet 容器还是其他容器,都不需要将独立应用程序转换为 webapp,或者添加 Spring 之类的东西,只是为了拥有池数据源。“使用 C3P0”是比实际“答案”更好的答案。国际海事组织。 (3认同)
  • 奇怪的答案。“数据源需要由任何容器管理” - 不,没有数据源_需要_由任何容器管理。可以,但没必要。仅仅为了有连接池而引入容器是不合理的。要手动添加池,我建议使用 Apache Commons DBCP(就像 Tomcat 本身所做的那样),或者尝试 Tomcat 的 JDBC Pool(他们在版本 7 中实现的更快的一个,作为 Commons DBCP 的替代品)。 (2认同)