一只程序渣 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 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题