Java MySQL连接池无法正常工作

我在Java中编写了一个运行MySQL查询并返回结果的函数。 我在这里使用这种方法实现了连接池: http : //www.kodejava.org/how-do-i-create-a-database-connection-pool/ 。 该function正在运行,但连接时间仍然与没有汇集〜190毫秒时相同。 谁能告诉我我做错了什么?

这是我的代码:

public static ArrayList<Map> query(String q) throws Exception { long start, end; GenericObjectPool connectionPool = null; String DRIVER = "com.mysql.jdbc.Driver"; String URL = "jdbc:mysql://localhost/dbname"; String USER = "root"; String PASS = ""; Class.forName(DRIVER).newInstance(); connectionPool = new GenericObjectPool(); connectionPool.setMaxActive(10); ConnectionFactory cf = new DriverManagerConnectionFactory(URL, USER, PASS); PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, connectionPool, null, null, false, true); DataSource ds = new PoolingDataSource(connectionPool); //create statement Statement Stm = null; try { Connection Con = null; PreparedStatement stmt = null; start = System.currentTimeMillis(); Con = ds.getConnection(); end = System.currentTimeMillis(); System.out.println("DB Connection: " + Long.toString(end - start) + " ms"); //fetch out rows ArrayList<Map> Rows = new ArrayList<Map>(); Stm = Con.createStatement(); //query ResultSet Result = null; boolean Returning_Rows = Stm.execute(q); if (Returning_Rows) { Result = Stm.getResultSet(); } else { return new ArrayList<Map>(); } //get metadata ResultSetMetaData Meta = null; Meta = Result.getMetaData(); //get column names int Col_Count = Meta.getColumnCount(); ArrayList Cols = new ArrayList(); for (int Index=1; Index<=Col_Count; Index++) { Cols.add(Meta.getColumnName(Index)); } while (Result.next()) { HashMap Row = new HashMap(); for (String Col_Name:Cols) { Object Val = Result.getObject(Col_Name); Row.put(Col_Name,Val); } Rows.add(Row); } //close statement Stm.close(); //pass back rows return Rows; } catch (Exception Ex) { System.out.print(Ex.getMessage()); return new ArrayList<Map>(); } finally { if (Stm != null) { Stm.close(); } if (Stm != null) { Stm.close(); } System.out.println("Max connections: " + connectionPool.getMaxActive()); System.out.println("Active connections: " + connectionPool.getNumActive()); System.out.println("Idle connections: " + connectionPool.getNumIdle()); } } 

这是每次控制台输出:

 DB Connection: 186 ms Max connections: 10 Active connections: 1 Idle connections: 0 

更新:我应该注意,使用它的Java应用程序的工作方式如下:执行,只运行一个查询并关闭。 我想如果PHP工作原理如此,默认情况下它使用连接池,那么Java应该如何? 如我错了请纠正我。

您创建了一个连接池,但是您没有添加任何内容。 连接池在创建时是空的,因此您对它的第一个请求保证创建新连接,并且与手动获取连接一样慢。

尝试将代码放入循环中,重复从池中获取连接。 尝试一次,五次,十次和十五次。 注意结果如何变化。

某些连接池支持自动创建和保持最少数量的连接以及最大值 。 初始化池时,它将预取连接,因此前几个调用不会延迟。

您对数据库的单个请求不会有任何区别。 您必须使用多个(并发)请求对此进行测试。

顺便说一下:您遵守Java命名约定并以小写字母启动所有对象。

您可以通过调用connectionPool.addObject()来预加载池。 在开始时它是空的,只有在您发布查询后才创建连接。

您的用例不保证连接池。 它只需要一个连接。 您使用GenericObjectPool的池类有一个方法addObject(); 。 这将创建对象并将其添加到池中。 这将避免以后创建连接。