批量更新发生时处理锁定情况C3po和oracle

时间:2019-10-30 20:49:06

标签: java oracle c3p0

有时候我的线程停留在这种状态,我认为数据库连接上有一个锁,所以我该如何解决这个锁;这种情况发生在唯一约束错误然后对每个记录进行处理的onebyone方法中

db_config = {k: os.environ.get(v) for k, v in config.items()
             if v in os.environ}

c3po设置

"scheduling-1" - Thread t@38
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at oracle.net.ns.Packet.receive(Packet.java:300)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:106)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
        at oracle.jdbc.driver.OraclePreparedStatement.executeForRowsWithTimeout(OraclePreparedStatement.java:10130)
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10249)
        - locked <7026a1d3> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
        at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2544)
        at org.springframework.jdbc.core.JdbcTemplate.lambda$batchUpdate$2(JdbcTemplate.java:950)
        at org.springframework.jdbc.core.JdbcTemplate$$Lambda$463/1248908034.doInPreparedStatement(Unknown Source)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:646)
        at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:936)

数据库查询-

ds.tes.jdbcUrl=jdbc:oracle:thin:AASDAS
ds.tes.driverClass = oracle.jdbc.driver.OracleDriver
ds.tes.username=AA
ds.tes.password=P_AA
ds.tes.maxPoolSize = 550
ds.tes.minPoolSize = 5
ds.tes.initPoolSize = 10
ds.tes.acquireInc = 5
ds.tes.acquireRetryAtt = -1

方法流程

 @Override
   public void insertDeliver(List<SrmDeliver> srm) {
      logger.info("insertSrmDeliver - begin "+srm.size());

      getJdbcTemplate().batchUpdate(SRM_DELIVER_SQL, new BatchPreparedStatementSetter() {


         @Override
         public void setValues(PreparedStatement ps, int i) throws SQLException {
            TimeStamp time = new TimeStamp();
            final Calendar date = time.setup(srm.get(i).receiveTime, dateFormat);
            Timestamp timestamp = new Timestamp(date.getTimeInMillis());

            ps.setInt(1, srm.get(i).nodeId);
            setInteger(ps, 2, ( srm.get(i)).service);
            ps.setString(3, ( srm.get(i)).client);
            ps.setString(4, ( srm.get(i)).reportId);
            setInteger(ps, 5, ( srm.get(i)).resultCode);
            ps.setTimestamp(6, timestamp);
         }

         @Override
         public int getBatchSize() {
            return srm.size();
         }
      });

      logger.info("insertSrmDeliver - end "+srm.size());

应用程序日志

   private boolean insertRows(List<T> chunkList, List<String> dbErrorList) {

      boolean retval = false;
      try {

         insertChunksToDb(chunkList);

         retval = true;

      } catch (Exception e) {
         logger.error(" DB Exception. Hash:" + this.hashCode(), e);
         insertOneByOne(chunkList, dbErrorList);
         return false;

      }

      return retval;
   }

0 个答案:

没有答案
相关问题