我正在运行此方法来使用DBCP连接池更新SQL:
完全8次后,方法setValue停止这样做,并且不会发送任何数据。
public static void setValue(String user, Integer id){
Connection connection = null;
try {
try {
connection = DataSource.getInstance().getConnection();
} catch (IOException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
ttl++;
PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
ps.setString(1, user);
ps.setInt(2, id);
ps.executeUpdate();
ps.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return;
}
我不熟悉MySQL或连接池,我不知道这里出了什么问题。请帮我解决此问题或提供任何建议?非常感谢你!
答案 0 :(得分:2)
我的猜测是你只是在使用池中的所有连接
尝试输入finally块
finally {
connection.close();
}
即使您使用的是连接池,您仍然必须关闭连接 - 它只是连接池实际上没有关闭它,它只是将它返回到池中,所以其他人可以使用它它
答案 1 :(得分:2)
是的,您应该关闭连接,这只会将其返回到池中。基本上你应该在方法的finally {}块中添加它。希望这会有所帮助。
public static void setValue(String user, Integer id){
Connection connection = null;
try {
try {
connection = DataSource.getInstance().getConnection();
} catch (IOException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
ttl++;
PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
ps.setString(1, user);
ps.setInt(2, id);
ps.executeUpdate();
ps.close();
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
if (connection != null) connection.close();
}
return;
}
答案 2 :(得分:1)
使用try catch finally块,在try中提交连接,在finally中关闭准备好的语句,然后在异常回滚中。
public static void setValue(String user, Integer id){
Connection connection = null;
try {
try {
connection = DataSource.getInstance().getConnection();
} catch (IOException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
ttl++;
PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
ps.setString(1, user);
ps.setInt(2, id);
ps.executeUpdate();
connection.commit();
} catch (SQLException ex) {
connection.rollback();
ex.printStackTrace();
}
finally {
ps.close();
}
return;
}