81,122
社区成员




//对于二维码的生成分批次处理,以500为一个单位
List<QrCode> qrCodes = new ArrayList<QrCode>();
long alwaysStartTime = System.currentTimeMillis();
long startTime = System.currentTimeMillis();
for (int i = 1; i <= tagsGenerateModel.getTagsCounts(); i++) {
serialNumber ++;
String selfGrowthNo = serialNumberServiceAccess.genSerialNumber(SysConstant.TAGS_BATCH_QR_CODE_TENANTID, "pqms:tags:qrcode"+tagsId);
/** 生成单元识别代码 */
String unitCode = tagsServiceComp.genUnitIdentiCode(tags, pesticideProduct, selfGrowthNo);
//创建二维码
QrCode qrCode = new QrCode();
qrCode.setId(UuidUtils.newid());
qrCode.setEnterpriseId(tagsGenerateModel.getEnterpriseId());
qrCode.setQrCode(unitCode);
qrCode.setScanCount(0);
qrCode.setPesticideProductId(tagsGenerateModel.getProductId());
qrCode.setProductBatchId("");
qrCode.setQrCodeBatchId(tags.getId());
qrCode.setStatus(0); // 状态 0 正常 1 召回 2 作废
qrCode.setQrCodePath("");
qrCode.setCreateTime(new Date());
qrCode.setUpdateTime(new Date());
qrCode.setSerialNumber(serialNumber);
qrCode.setIsDownload("0"); // 是否下载过 0 未下载过 1 下载过
qrCode.setIsActive(String.valueOf(tagsGenerateModel.getActiveMethod())); // 是否激活 0-激活,1-未激活
qrCodes.add(qrCode);
unitCodeLst.add(unitCode);
if (i % 500 == 0) {//如果当前次数为500整数倍,则为一个批次,进行批量插入
qrCodeDao.batchInsert(qrCodes);
qrCodes.clear();//清空list,准备下一次存储
long endTime = System.currentTimeMillis();
logger.info("\r\n**第" + (i / 500) + "此插入500条数据费时:\r\n" + (endTime - startTime) + "毫秒\r\n");
startTime = System.currentTimeMillis();
}
if (i == tagsGenerateModel.getTagsCounts() && qrCodes.size() > 0) {//如果全部数据 或者 剩余数据
qrCodeDao.batchInsert(qrCodes);
qrCodes = null;
long endTime = System.currentTimeMillis();
logger.info("\r\n**最后的" + (i % 500) + "条数据费时:\r\n" + (endTime - startTime) + "毫秒\r\n");
}
}
long alwaysEndTime = System.currentTimeMillis();
logger.info("\r\n**插入" + tagsGenerateModel.getTagsCounts() + "条数据总共费时:\r\n" + (alwaysEndTime - alwaysStartTime) + "毫秒\r\n");
<insert id="batchInsert" parameterType="java.util.List">
insert into PQMS_QR_CODE (id, enterprise_id, qr_code,
scan_count,
pesticide_product_id, product_batch_id,
qr_code_batch_id, status,
qr_code_path,
create_time, update_time, serial_number,
is_download,
is_active)
values
<foreach collection="list" item="item" index="index"
separator=",">
(#{item.id,jdbcType=VARCHAR}, #{item.enterpriseId,jdbcType=VARCHAR},
#{item.qrCode,jdbcType=VARCHAR},
#{item.scanCount,jdbcType=INTEGER}, #{item.pesticideProductId,jdbcType=VARCHAR},
#{item.productBatchId,jdbcType=VARCHAR},
#{item.qrCodeBatchId,jdbcType=VARCHAR}, #{item.status,jdbcType=INTEGER},
#{item.qrCodePath,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP},
#{item.serialNumber,jdbcType=INTEGER},
#{item.isDownload,jdbcType=CHAR}, #{item.isActive,jdbcType=CHAR})
</foreach>
</insert>
#DRUID
#最大连接池数量
druid.maxActive=50
#最小连接池数量
druid.minIdle=3
#初始化时建立物理连接的个数
druid.initialSize=1
#获取连接时最大等待时间,单位毫秒
druid.maxWait=6000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
druid.timeBetweenEvictionRunsMillis=120000
#配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=300000
#连接超时是否自动关闭
druid.removeAbandoned=true
#自动关闭的超时时间
druid.removeAbandonedTimeout=1800
### Error updating database. Cause: java.sql.SQLException: connection holder is null
### SQL: insert into PQMS_QR_CODE (id, enterprise_id, qr_code, scan_count, pesticide_product_id, product_batch_id, qr_code_batch_id, status, qr_code_path, create_time, update_time, serial_number, is_download, is_active) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ...........省略
### Cause: java.sql.SQLException: connection holder is null
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; connection holder is null; nested exception is java.sql.SQLException: connection holder is null
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:421)
at com.sun.proxy.$Proxy13.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:254)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:52)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy32.batchInsert(Unknown Source)
at com.ymhy.pqms.persist.dao.QrCodeDao.batchInsert(QrCodeDao.java:247)
at com.ymhy.pqms.service.TagsServiceImpl.generateTags(TagsServiceImpl.java:224)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy65.generateTags(Unknown Source)
at com.alibaba.dubbo.common.bytecode.Wrapper24.invokeMethod(Wrapper24.java)
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: connection holder is null
at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1122)
at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1110)
at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:318)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:79)
at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:58)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:76)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:115)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:170)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:157)
at sun.reflect.GeneratedMethodAccessor296.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:408)
... 48 more
#DRUID
#最大连接池数量
druid.maxActive=50
#最小连接池数量
druid.minIdle=3
#初始化时建立物理连接的个数
druid.initialSize=1
#获取连接时最大等待时间,单位毫秒
druid.maxWait=120000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
druid.timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=300000
这是spring中的配置:
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 最大连接池数量 -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- 最小连接池数量 -->
<property name="minIdle" value="${druid.minIdle}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${druid.maxWait}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<!-- 对于长时间不使用的连接强制关闭 -->
<property name="removeAbandoned" value="true" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="defaultAutoCommit" value="true" />
</bean>
这是事务:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public ServiceResult generateTags(TagsGenerateModel tagsGenerateModel) {}
插入第28左右的时候出的错,每次大约耗时10秒钟,差不多5分钟吧