我在Java中编写了一个运行MySQL查询并返回结果的函数。我在这里使用此方法实现了连接池:http://www.kodejava.org/how-do-i-create-a-database-connection-pool/。该功能正在运行,但连接时间仍然与没有汇集〜190 ms的情况相同。有人能告诉我我做错了什么吗?
这是我的代码:
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());
}
}
每次都是控制台输出:
DB Connection: 186 ms
Max connections: 10
Active connections: 1
Idle connections: 0
更新:我应该注意,使用它的Java应用程序的工作方式如下:执行,只运行一个查询并关闭。我想如果PHP的工作方式如此,默认情况下它使用的是连接池,那Java应该是吗?如果我错了,请纠正我。
答案 0 :(得分:2)
您创建了一个连接池,但是您没有添加任何内容。连接池在创建时是空的,因此您对它的第一个请求保证创建一个新连接,并且与手动获取连接一样慢。
尝试将代码放入循环中,重复从池中获取连接。尝试一次,五次,十次和十五次。注意结果如何变化。
某些连接池支持自动创建并保持最小数量的连接,以及最大。初始化池时,它将预取连接,因此前几次调用不会延迟。
答案 1 :(得分:0)
您对数据库的单个请求不会有任何区别。您必须使用多个(并发)请求对此进行测试。
顺便说一下:您遵守Java命名约定并以小写字母启动所有对象。
答案 2 :(得分:0)
您可以致电connectionPool.addObject()
预先加载您的游泳池。在开始时它是空的,只有在您发布查询后才创建连接。
答案 3 :(得分:0)
您的使用案例不保证连接池。它只需要一个连接。
您使用GenericObjectPool
的池类具有方法addObject();
。这将创建对象并将其添加到池中。这将避免以后创建连接。