gpt4 book ai didi

Java MySQL 连接池不工作

转载 作者:行者123 更新时间:2023-11-29 08:25:25 25 4
gpt4 key购买 nike

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

这是我的代码:

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 也应该这样吗?如果我错了请纠正我。

最佳答案

您创建了一个连接池,但没有向其中放入任何内容。连接池在创建时是空的,因此您对它的第一个请求一定会创建一个新连接,并且与手动获取连接一样慢。

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

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

关于Java MySQL 连接池不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com