异常A web application registered the JBDC driver [com.mysql.jdbc.Driver] but faile

本文解析了一个web应用程序在重新部署时出现的JDBC驱动异常问题,详细解释了异常产生的原因及如何避免内存泄漏。

异常:

A web application registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 

抛出:AbandonedConnectionCleanupThread异常

 

意思是:

一个web应用程序注册的JDBC驱动程序[com.mysql.jdbc.Driver],但Web应用程序时停止时未能注销。为了防止内存泄漏,JDBC驱动程序已被强行注册,因为一个项目启动时,只需要注册一个JDBC驱动链接即可

 

在服务器保持运行的状态中,redeploy(重新部署)这个项目, 就出现该异常!

因为在tomcat中有个选项,是否reload,如果勾选,则会出现该异常,因为驱动连接一次就可以,不用重复的去开启

** END NESTED EXCEPTION ** 15:03:27.337 [main] INFO c.a.d.p.DruidDataSource - [close,1928] - {dataSource-1} closed 15:03:27.339 [main] INFO o.a.c.c.StandardService - [log,173] - Stopping service [Tomcat] 15:03:27.352 [main] ERROR o.s.b.SpringApplication - [reportFailure,858] - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysJobController': Unsatisfied dependency expressed t hrough field 'jobService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysJobServiceIm pl': Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Error clearing scheduling data: Lock wait timeout excee ded; try restarting transaction [See nested exception: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProces sor.java:596) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.jav a:374) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1378) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:846) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:863) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) at com.ruoyi.RuoYiApplication.main(RuoYiApplication.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysJobServiceImpl': Invocation of init method faile d; nested exception is org.quartz.JobPersistenceException: Error clearing scheduling data: Lock wait timeout exceeded; try restarting transaction [See nested exception: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPos tProcessor.java:139) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:419) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1737) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:273) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1237) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ... 27 common frames omitted Caused by: org.quartz.JobPersistenceException: Error clearing scheduling data: Lock wait timeout exceeded; try restarting transaction at org.quartz.impl.jdbcjobstore.JobStoreSupport.clearAllSchedulingData(JobStoreSupport.java:2015) at org.quartz.impl.jdbcjobstore.JobStoreSupport$24.executeVoid(JobStoreSupport.java:2006) at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3765) at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3763) at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:245) at org.quartz.impl.jdbcjobstore.JobStoreSupport.clearAllSchedulingData(JobStoreSupport.java:2002) at org.quartz.core.QuartzScheduler.clear(QuartzScheduler.java:1541) at org.quartz.impl.StdScheduler.clear(StdScheduler.java:239) at com.ruoyi.quartz.service.impl.SysJobServiceImpl.init(SysJobServiceImpl.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcess or.java:363) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBea nPostProcessor.java:307) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ... 39 common frames omitted Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:974) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1113) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061) at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1381) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1046) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:255) at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.clearData(StdJDBCDelegate.java:565) at org.quartz.impl.jdbcjobstore.JobStoreSupport.clearAllSchedulingData(JobStoreSupport.java:2013) ... 54 common frames omitted还报错了这个,这个启动问题要怎么解决
最新发布
05-21
### MySQL 锁等待超时问题分析 当遇到 `MySQLTransactionRollbackException` 或者 `Lock wait timeout exceeded` 的错误时,这通常表明在数据库操作过程中存在长时间的锁等待现象。这种问题可能由多种原因引起,包括但不限于死锁、事务未及时提交或回滚以及查询性能低下。 #### 数据库连接和事务管理中的常见问题 Spring Boot 和 Quartz 结合使用时,如果某个任务执行时间过长或者未能正确释放资源,则可能导致其他线程无法获取所需的表级或行级锁定[^1]。具体来说: - **Quartz 调度器的任务设计不合理**:某些定时作业可能会占用大量资源并保持较久的状态转换周期。 - **SQL 查询效率低劣**:复杂的联结运算或是缺乏索引支持都会延长读写过程所需的时间窗口。 - **不当配置的最大允许等待时限参数**:默认情况下,“innodb_lock_wait_timeout”的值设得较低 (如 50 秒),对于高并发环境而言或许不够充分[^2]。 #### 配置调整建议 为了缓解此类状况的发生频率及其影响程度,可以从以下几个方面入手优化设置: 1. 增加 InnoDB 存储引擎下的最大锁等待秒数: ```sql SET GLOBAL innodb_lock_wait_timeout = 120; ``` 2. 修改 Spring 应用程序上下文中关于数据源属性的相关定义部分来增强重试机制逻辑处理能力;例如通过引入 HikariCP 这样的高性能 JDBC 连接池解决方案可以有效改善连接耗尽情况下的表现行为[^3]: ```yaml spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.maximum-pool-size=10 ``` 3. 对于频繁触发更新/删除动作的目标记录集考虑采用乐观锁策略代替悲观模式从而减少潜在冲突几率的同时提高整体吞吐量水平[^4]: ```java @Version private Integer version; // Ensure proper exception handling during concurrent modifications. try { entityManager.merge(entity); } catch(OptimisticLockException ole){ log.error("Concurrency issue detected while updating entity.", ole); throw new RuntimeException(ole.getMessage(), ole); } ``` 4. 定期审查慢日志文件找出那些特别耗费计算力的操作语句进而针对性地创建合适的辅助结构比如覆盖型复合索引来加速访问路径[^5]. #### 处理异常后的恢复措施 一旦检测到因上述任一因素引发的应用崩溃事件之后除了立即重启服务恢复正常运行之外还应该采取必要的补救行动防止类似情形再次发生: - 认真排查涉及的所有业务流程环节是否存在不必要的长期持有共享资源的现象; - 利用 AOP 技术围绕关键方法包裹额外的日志记录功能以便后续诊断分析之需; - 如果条件许可的话还可以部署专门用于监控数据库健康状态的服务组件随时掌握实时动态变化趋势图谱信息等等[^6]. ```python import logging from aspectlib import Aspect, Proceed @Aspect(bind=True) def trace_calls(cutpoint, *args, **kwargs): logger = logging.getLogger(__name__) logger.debug(f'Entering {cutpoint.__qualname__} with arguments {args}, {kwargs}') result = yield Proceed logger.debug(f'Result from {cutpoint.__qualname__}: {result}') # Apply the aspect to a function or method as needed. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值