diff --git a/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java b/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java index 9cab44ce14b1a2a1335e4298faa4f059f8422879..33d8caf7643069d3d8962e6903e6de7cc160d4af 100644 --- a/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java +++ b/caf-lock/caf-lock-extension-jpa/src/main/java/io/iec/edp/caf/lock/extension/jpa/JpaLockExtensionImpl.java @@ -19,8 +19,12 @@ import io.iec.edp.caf.lock.service.spi.utils.LockValidateResolverUtils; import io.iec.edp.caf.lockservice.api.*; import lombok.extern.slf4j.Slf4j; import lombok.var; +import org.hibernate.engine.spi.SessionImplementor; import javax.persistence.EntityManager; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.sql.SQLTransientConnectionException; import java.time.Duration; import java.time.OffsetDateTime; @@ -202,6 +206,8 @@ public class JpaLockExtensionImpl implements LockExtension { return result; } } + Connection connection=null; + PreparedStatement ps=null; JpaTransaction tran = JpaTransaction.getTransaction(); try { tran.begin(TransactionPropagation.REQUIRES_NEW); @@ -211,12 +217,35 @@ public class JpaLockExtensionImpl implements LockExtension { } List entityList = createBatchEntities(mkId, dataCat, dataIds, groupId, persistenceTime, funcId, comment,contextInfo); + String sql = "insert into gspbatchlock(id,categoryid,comments,contextid,dataid,funcid,groupid,mkid,sessionid,suname,userid,expiredtime,locktime) values(?,?,?,?,?,?,?,?,?,?,?,?,?)"; + SessionImplementor session = em.unwrap(SessionImplementor.class); + connection =session.connection(); + ps = connection.prepareStatement(sql); long time4=System.currentTimeMillis(); for (int i = 0; i < entityList.size(); i++) { - em.persist(entityList.get(i)); +// em.persist(entityList.get(i)); +// if ((i+1) % batchSize == 0 || i == entityList.size() - 1) { +// em.flush(); +// em.clear(); +// } + //优化使用PreparedStatement提高保存性能 + BatchLockEntity entity = entityList.get(i); + ps.setString(1, entity.getId()); + ps.setString(2, entity.getCategoryId()); + ps.setString(3, entity.getComment()); + ps.setString(4, entity.getContextId()); + ps.setString(5, entity.getDataId()); + ps.setString(6, entity.getFuncId()); + ps.setString(7, entity.getGroupId()); + ps.setString(8, entity.getMkId()); + ps.setString(9, entity.getSessionId()); + ps.setString(10, entity.getSuName()); + ps.setString(11, entity.getUserId()); + ps.setObject(12, entity.getExpiredTime()); + ps.setObject(13, entity.getLockTime()); + ps.addBatch(); if ((i+1) % batchSize == 0 || i == entityList.size() - 1) { - em.flush(); - em.clear(); + ps.executeBatch(); } } if(log.isDebugEnabled()){ @@ -239,6 +268,21 @@ public class JpaLockExtensionImpl implements LockExtension { } catch (Throwable e) { tran.rollback(); throw new io.iec.edp.caf.lock.service.api.exception.DistributedLockException("caf", DLErrorDefinition.AddBatchLock_Error,"addBatchLockError",e, ExceptionLevel.Error,false); + }finally { + if(ps!=null){ + try { + ps.close(); + } catch (SQLException e) { + log.error("closePreparedStatementError: ",e); + } + } + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + log.error("closeConnectionError: ",e); + } + } } }