spring-mybatis 大批量插入数据问题

s_snow. 2017-12-20 03:55:01
项目搭建是springmvc + mybatis业务需求:客户一次创建几万条二维码数据
目前后台实现思路:以500为一个批次,每个批次在mybatis中采用foreach循环语句一次性插入数据库
出现问题: java.sql.SQLException: connection holder is null


首先附上后台service处理逻辑:
//对于二维码的生成分批次处理,以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");

在for循环中的genSerialNumbergenUnitIdentiCode 方法都会与数据库连接查询数据。
再让大家看下我的mapping配置文件:
<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

本人入行时间不长,对数据库研究没有很多研究,碰见这种问题实在是无从下手,有大神路过,麻烦给点建议,先谢谢了
...全文
3855 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
之前的报错信息不全面
### 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
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
引用 7 楼 hanpoyangtitan 的回复:
看异常信息貌似是 druid.removeAbandonedTimeout=1800 是这个的问题,你的这个方法上配置了事务吗?你这个方法整体执行了多久?
#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分钟吧
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
引用 2 楼 dong_19890208 的回复:
应该是事务配置的问题,楼主可以参考一下 https://github.com/alibaba/druid/issues/1429
我按照他的方法 该了事务,还是报错了
那年花 2017-12-20
  • 打赏
  • 举报
回复
超时了 那个for循环在java里面拼
什么都不能 2017-12-20
  • 打赏
  • 举报
回复
看异常信息貌似是 druid.removeAbandonedTimeout=1800 是这个的问题,你的这个方法上配置了事务吗?你这个方法整体执行了多久?
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
我现在主要是没有思路,connection为null引起这个问题的原因是什么?是初始数量的问题 还是等待时间 或者 超时时间 。500条数据插入一次,我这个sql在插入的时候会调用多少connection,封装qrcode查询的时候,调用的sql是不是查询完了之后马上归还,着500条数据插入完成进入下一次循环之前的connection有没有被释放,这些我都不是很明确,但苦于没有debug的办法,我再去看一下源码吧
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
引用 4 楼 xwn_2016 的回复:
在你原来的基础上,再自己创建sqlsession 不要自动commit 其他的,另外insert语句也可以拼一下,比如几十条数据拼成一个insert,这样再套上你的foreach循环,就可以了
不是很明白,sqlsession是spring自己创建的,自己创建session是用jdbc的意思吗,而且也再service的方法上开启了spring的事务,insert语句按照我上面的mapper.xml的配置就是500条数据拼成一个sql。。。能详细说一下吗
xwn_2016 2017-12-20
  • 打赏
  • 举报
回复
在你原来的基础上,再自己创建sqlsession 不要自动commit 其他的,另外insert语句也可以拼一下,比如几十条数据拼成一个insert,这样再套上你的foreach循环,就可以了
liangchengfck1 2017-12-20
  • 打赏
  • 举报
回复
Caused by: java.sql.SQLException: connection holder is null
dong_19890208 2017-12-20
  • 打赏
  • 举报
回复
应该是事务配置的问题,楼主可以参考一下 https://github.com/alibaba/druid/issues/1429
s_snow. 2017-12-20
  • 打赏
  • 举报
回复
报错日志: 2017-12-20 15:39:34 [ INFO] - **第29此插入500条数据费时: 11574毫秒 2017-12-20 15:39:43 [ INFO] - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 2017-12-20 15:39:43 [ INFO] - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana] 2017-12-20 15:39:43 [ WARN] - Error while extracting database product name - falling back to empty error codes org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: connection holder is null at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:305) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:329) at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) at org.mybatis.spring.MyBatisExceptionTranslator.initExceptionTranslator(MyBatisExceptionTranslator.java:86) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 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:221) 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:1113) at com.alibaba.druid.pool.DruidPooledConnection.getMetaData(DruidPooledConnection.java:845) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:294) ... 55 more

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧