gpt4 book ai didi

java - 为什么这个错误 - 无法获得连接,池错误等待空闲对象超时

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

我在生产环境中有一个 web 应用程序,它可以正常运行 7-8 天,然后我的网站突然关闭并且日志重现此错误:

java.sql.SQLException: 无法获取连接,池错误 Timeout waiting for idle object

所有对数据库的操作开始失败。我已经阅读了其他几个问题和博客,但找不到任何明确的解决方案。我正在使用连接池,我真的不确定问题出在哪里。

是因为我写的代码还是池配置?我在这里为从数据库和池配置获取数据的方法之一提供代码。请看一下,如果我做错了什么请告诉我。

public CartItem getCustomerCartItem(int customerId, int productId, int productOfCityId) {
Connection con = ConnectionPool.getInstance().getConnection();
PreparedStatement st = null;
ResultSet rs = null;
CartItem ci = null;

CityProduct cityProduct = productService.getCityProduct(productId, productOfCityId);
if (cityProduct == null) {
return null;
}

String query = "SELECT ci.* FROM customer_cart_item_mapping cim INNER JOIN cart_item ci ON ci.Id = cim.CartItemId WHERE "
+ "cim.CustomerId = ? AND ci.ProductOfCityId = ?";

try {
st = con.prepareCall(query);

st.setInt(1, customerId);
st.setInt(2, productOfCityId);

rs = st.executeQuery();

if (rs.first()) {
ci = new CartItem();
ci.setId(rs.getInt("Id"));
ci.setCityProduct(cityProduct);
ci.setQuantity(rs.getInt("Quantity"));
ci.setCreatedDate(rs.getDate("CreatedDate"));
ci.setUpdatedDate(rs.getDate("UpdatedDate"));
}
} catch (SQLException ex) {
Logger lgr = Logger.getLogger(CartItemDaoImpl.class.getName());
lgr.log(Level.SEVERE, ex.getMessage(), ex);

} finally {
DBUtil.close(con, st, rs);
}

return ci;
}

下面是用于关闭连接的DBUtil类:

公共(public)类 DBUtil {

public static void close(Connection c, Statement s, ResultSet r) {
try {
if (r != null) {
r.close();
}
if (s != null) {
s.close();
}
if (c != null) {
ConnectionPool.getInstance().freeConnection(c);
}

} catch (SQLException ex) {
Logger.getLogger(DBUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}

下面是ConnectionPool

public class ConnectionPool {
private static ConnectionPool pool=null;
private static DataSource dataSource = null;

public synchronized static ConnectionPool getInstance(){
if (pool == null){
pool = new ConnectionPool();
}
return pool;
}

private ConnectionPool(){
try{
InitialContext ic = new InitialContext();
dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/prod_db");
}
catch(NamingException e){
System.out.println(e);
}
}

public Connection getConnection(){
try{
return dataSource.getConnection();
}
catch (SQLException sqle){
System.err.println(sqle);
return null;
}
}

public void freeConnection(Connection c){
try{
c.close();
}
catch (SQLException sqle){
System.err.println(sqle);
}
}

下面是连接池配置

<Context antiJARLocking="true" path="/">
<Resource auth="Container" connectionProperties="useEncoding=true;" driverClassName="com.mysql.jdbc.Driver" initialSize="2"
logAbandoned="true" maxIdle="40" maxTotal="70" maxWaitMillis="1000" minEvictableIdleTimeMillis="600000" minIdle="2" name="jdbc/winni_prime_db"
password="password" removeAbandoned="true" removeAbandonedTimeout="90" testWhileIdle="true" timeBetweenEvictionRunsMillis="90000"
type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/prod_db"
username="sqladmin" validationQuery="SELECT 1"/>

这个问题在过去几个月一直存在。唯一的解决办法是每晚重启 tomcat。请看一下这段代码,并在我做错的地方给我一个专家意见。我正在使用 MySQL

最佳答案

你可能会舔这里:

if (cityProduct == null) {
return null;
}

您在此代码之前已经建立连接,但您可以在不关闭连接的情况下退出功能。

关于java - 为什么这个错误 - 无法获得连接,池错误等待空闲对象超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30185444/

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