EJB3.1 批量保存 高并发后部分查询不到数据

技术背景:项目采用EJB3.1,数据库使用Orac11G、中间件使用WAS8.5 ,系统采用AIX

项目背景:用户将XML文件上传到服务器,服务器解析并保存,保存完毕后,对于数据进行校验

问题描述:当高并发上来后,总有少量用户的的数据在数据校验失败。

                    失败原因:校验时查询数据库中的数据不全,但数据库中数据是全的。例如:数据库中有5000条这个用户的数据,在校验时,只发现1000条。

代码:

保存:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  public void addBatchImm(List<Pisaodt3010> pisaList) throws SQLException
  {
    if (pisaList == null || pisaList.size() == 0)
    {
      return;
    }
    Connection conn = null;
    String sql = "insert /*+append*/ into Pisaodt3010(id,altime,subage,periods,freq,part,indexno,dimno,orgno,areatype,areacode,BUSFLAG,varvalue,varvalue2) values(SEQ_COLLDA_ID.nextval,sysdate,?,?,?,?,?,?,?,?,?,'1',?,?)";
    
    try
    {
      conn = (Connection) ((OpenJPAEntityManager) getEm().getDelegate()).getConnection()
      PreparedStatement ps = conn.prepareStatement(sql);
      for (Pisaodt3010 pisa : pisaList)
      {
        ps.setString(1, pisa.getSubage());
        ps.setString(2, pisa.getPeriods());
        ps.setString(3, pisa.getFreq());
        ps.setString(4, pisa.getPart());
        ps.setString(5, pisa.getIndexno());
        ps.setString(6, pisa.getDimno());
        ps.setString(7, pisa.getOrgno());
        ps.setString(8, pisa.getAreatype());
        ps.setString(9, pisa.getAreacode());
        ps.setString(10, pisa.getVarvalue());
        ps.setString(11, pisa.getVarvalue2());
        ps.addBatch();
      }
      ps.executeBatch();
      ps.close();
      conn.close();
    } catch (SQLException e)
    {
      logger.error("批量保存数据异常!", e);
      throw e;
    }
    this.flush();
    this.clear();
  }

 查询:             

List countList = pisaodt3010Dao.queryNativeSQLList("select count(*) from Pisaodt3010 where part='"+part+"' and subage=?1", new String[]{subage});
    logger.info("机构报送总条数["+countList.get(0)+"]");

 解决方式

entityManager.getEntityManagerFactory().getCache().evictAll(); 清空二级缓存;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值