一只程序渣 2016-04-21 03:12 采纳率: 100%
浏览 1637
已采纳

dbcp 导致oracle存在很多incative session

    小弟是往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();
                        }

                    }
                }

            }
        }
  • 写回答

1条回答 默认 最新

  • 一只程序渣 2016-04-28 13:06
    关注

    结题了,我自己已经找到了问题。就出现在

          public TempDAO() {
            init();
        }
    
        private void init() {
            DBCP dbcp = new DBCP();
            con = dbcp.getCon();
        }
    

    这一块DBCP应该被加载到static块里,好让类在加载时候只加载一次,我原来的这种写法,是因为我在别的地方多次new TempDAO(),
    其实在不断的new DBCP(),so...i'm stupid

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用Thoony写ESP32温湿度检测无源蜂鸣器报警代码?
  • ¥20 部件内部的CT图像数据集
  • ¥15 Visual studio调用动态库
  • ¥15 双目摄像头标定后的校准文件
  • ¥15 powerbi矩阵增加度量值后出现对应关系错乱
  • ¥30 频率分析法分析绘制奈奎斯特图、波特图
  • ¥15 弹出来一万个系统找不到指定的文件框框,怎么解决
  • ¥15 ADS生成的微带线为什么是蓝色空心的
  • ¥15 求一下解题思路,完全不懂
  • ¥15 tensorflow