往oracle数据库里插入数据,Connection 是从DBCP里拿到的,在插入后对Connection和PreparedStament都有作finally{.close()}处理,但是发现oracle中v$session 存在很多inactive session。是我没正确关闭吗?
public class TempDAO {
private Connection con;
private PreparedStatement ptst;
public TempDAO() {
init();
}
private void init() {
DBCP dbcp = new DBCP();
con = dbcp.getCon();
}
public void insertTempa(List<Tempa> tempaLists) {
String sql = "insert into gps_gsp_test(gps_time,temp1,temp2,vehicle_number,entry_time) values(?,?,?,?,?)";
try {
/**
* 这里不能con.prepareStatement(sqlStr,Statement.RETURN_GENERATED_KEYS)赋值
* Statement.RETURN_GENERATED_KEYS是获取最大主键值,若数据库表没有主键,批量处理会有问题!
*/
ptst = con.prepareStatement(sql);
for(Tempa temp : tempaLists) {
ptst.setTimestamp(1,new Timestamp(temp.getCollectTime().getTime()));
ptst.setDouble(2,temp.getTemp1());
ptst.setDouble(3,temp.getTemp2());
ptst.setString(4,temp.getCarNo());
ptst.setTimestamp(5,new Timestamp(temp.getEntryTime().getTime()));
ptst.addBatch();
// ptst.executeUpdate();
}
ptst.executeBatch();
con.commit();
ptst.clearBatch();
System.out.println("数据插入成功!");
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
System.out.println("数据插入失败!");
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally{
if(ptst != null){
try {
ptst.close();
ptst = null;
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(con != null){
try {
con.close();
con = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
看您的逻辑, TempDAO 这个类应该是个单例类,不然DBCP本身就没有意义了.
如果是单例的类,那么在并发场景下您的代码就有严重的问题.
如果不是单例的类,那么DBCP本身没有关闭,会出现很多无效的连接.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。