Java MySQL连接池不工作
我用Java编写了一个函数,它运行MySQL查询并返回结果。我已在此处使用此方法实现了连接池:。该功能正在工作,但连接时间仍然与以前一样,没有共用约190毫秒。有人能告诉我我做错了什么吗 这是我的代码:Java MySQL连接池不工作,java,mysql,apache-commons,Java,Mysql,Apache Commons,我用Java编写了一个函数,它运行MySQL查询并返回结果。我已在此处使用此方法实现了连接池:。该功能正在工作,但连接时间仍然与以前一样,没有共用约190毫秒。有人能告诉我我做错了什么吗 这是我的代码: public static ArrayList<Map<String,Object>> query(String q) throws Exception { long start, end; GenericObjectPool connectionPo
public static ArrayList<Map<String,Object>> 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<String, Object>> Rows = new ArrayList<Map<String,Object>>();
Stm = Con.createStatement();
//query
ResultSet Result = null;
boolean Returning_Rows = Stm.execute(q);
if (Returning_Rows) {
Result = Stm.getResultSet();
} else {
return new ArrayList<Map<String,Object>>();
}
//get metadata
ResultSetMetaData Meta = null;
Meta = Result.getMetaData();
//get column names
int Col_Count = Meta.getColumnCount();
ArrayList<String> Cols = new ArrayList<String>();
for (int Index=1; Index<=Col_Count; Index++) {
Cols.add(Meta.getColumnName(Index));
}
while (Result.next()) {
HashMap<String,Object> Row = new HashMap<String,Object>();
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<String,Object>>();
} 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());
}
}
更新:我应该注意到,使用该方法的Java应用程序的工作原理如下:执行,只运行一个查询,然后关闭。我想如果PHP是这样工作的,并且默认使用连接池,那么Java也应该这样做吗?如果我错了,请纠正我。您创建了一个连接池,但没有将任何内容放入其中。您的连接池在创建时是空的,所以您对它的第一个请求保证会创建一个新连接,并且速度与手动获取连接一样慢 尝试将代码放入循环中,在循环中反复从池中获取连接。试一下,五次,十次,十五次。注意结果是如何变化的
某些连接池支持自动创建和保留准备使用的最小连接数和最大连接数。初始化池时,它将预取连接,以便前几个调用不会延迟。您不会看到对DB的单个请求有什么不同。您必须使用多个(并发)请求来测试这一点
顺便说一句:您遵守Java命名约定,并用小写字母启动所有对象。您可以通过调用
connectionPool.addObject()
预加载池。在开始时,它是空的,并且仅在您发布查询后创建连接。您的用例不保证有连接池。这只是你需要的一种连接。
您正在使用的池类有一个方法。这将创建对象并将其添加到池中。这将避免以后创建连接 问题是,应用程序只运行一个查询,我在我的“更新”中已经解释了更多内容。再一次,不需要为运行一次的应用程序创建连接池。如果只保留单个连接的引用,则连接池大小为1。我想你一定很在意PHP页面和你自己的Java应用程序的性能之间有200毫秒的差异。问题是,它是一个使用率很高的应用程序,我说的是,每当有人在一个大系统上加载任何页面时,它都会运行。。。每天数十万次。我想把那些完全浪费掉的200毫秒剃掉。可能是重复的
DB Connection: 186 ms
Max connections: 10
Active connections: 1
Idle connections: 0