gpt4 book ai didi

java - ComboPooledDataSource 不重用连接

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

正如标题中所说,我的 ComboPooledDataSource 在每次请求时创建一个新的数据库连接,并且从不重用或释放连接。我预先对 PreparedStatements、ResultSets 和 Connection 调用 close()。我正在使用 Tomcat 和 Amazon AWS Elastic Beanstalk 和 RDS。相关代码如下:

数据库类:

public class DB {

ComboPooledDataSource dataSource;

public static DB db = new DB();

private DB(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");

String db = System.getProperty("RDS_DB_NAME");
String username = System.getProperty("RDS_USERNAME");
String password = System.getProperty("RDS_PASSWORD");
String hostname = System.getProperty("RDS_HOSTNAME");
String port = System.getProperty("RDS_PORT");

String jdbcURL = "jdbc:mysql://" + hostname + ":" + port + "/" + db + "?user=" + username + "&password=" + password;

dataSource.setJdbcUrl(jdbcURL);

this.dataSource = dataSource;
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}

/**
* Get database name
* @return Databse name
*/
public static String dbN(){
return DATABASE;
}

/**
* Gets the database connection
* @return Database connection
* @throws SQLException
*/
public Connection getDatabase() throws SQLException{
return dataSource.getConnection();
}}

带有数据库调用的API

@GET
@Path("/{session}")
@Produces("application/json")
public Response getAll(@PathParam("session") String session){

JSONArray response = new JSONArray();
Connection conn = null;
PreparedStatement prepared = null;
ResultSet rs = null;

try {
conn = DB.db.getDatabase();
prepared = conn.prepareStatement("SQL STATEMENT");
prepared.setString(1, session);
prepared.setTimestamp(2, new Timestamp(Time.current()));

rs = prepared.executeQuery();

while(rs.next()){
JSONObject obj = new JSONObject();
obj.put("id", rs.getInt("id"));
obj.put("name", rs.getString("name"));
obj.put("color", rs.getString("color"));

response.put(obj);
}
} catch (SQLException e) {
e.printStackTrace();
return Response.status(500).build();
} finally{
try{
prepared.close();
rs.close();
conn.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
return Response.status(200).entity(response.toString()).build();
}

我一直在研究,但没有找到有效的解决方案。我知道它肯定在调用 conn.close() 和所有其他函数,但它们实际上都没有被关闭。我完全没有想法,有没有人知道

最佳答案

我最终放弃了 ComboPooledDataSource 并创建了我自己的基本池和连接包装器。连接包装器包装了 Connection 类,仅将 close() 和 isClosed() 函数替换为 boolean 值。池只容纳其中的许多,并在检索连接时寻找已关闭的连接,或者如果打开的太多则关闭它们。

关于java - ComboPooledDataSource 不重用连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37327295/

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