7cf0676ab6a6e06cc691b84db453d602ea486aa7
\345\246\202\344\275\225\345\256\232\344\275\215Druid\350\277\236\346\216\245\346\261\240\347\232\204\350\277\236\346\216\245\346\263\204\346\274\217\351\227\256\351\242\230\357\274\237.md
| ... | ... | @@ -252,6 +252,82 @@ ownerThread current state is RUNNABLE, current stackTrace |
| 252 | 252 | |
| 253 | 253 | ``` |
| 254 | 254 | |
| 255 | +## 3.2 powerjob连接泄露日志 |
|
| 256 | + |
|
| 257 | +a、为什么连接没还 |
|
| 258 | +这是 Druid 连接池检测到的“连接泄露”(abandon connection),泄露点就在 |
|
| 259 | +com.sie.snest.job.worker.processors.StandaloneProcessor.process(StandaloneProcessor.java:161)。 |
|
| 260 | +根本原因是: |
|
| 261 | +线程 powerjob-worker-light-task-execute-4 从 Druid 借走一条连接; |
|
| 262 | +随后该线程进入 CompletableFuture.get() 无限等待(WAITING),一直不 close() 连接; |
|
| 263 | +Druid 的 DestroyTask 在超时后强制回收,于是打出 abandon 日志。 |
|
| 264 | + |
|
| 265 | +``` |
|
| 266 | +2025-09-20 17:13:46.429 [Druid-ConnectionPool-Destroy-221036634] ERROR com.alibaba.druid.pool.DruidDataSource -abandon connection, owner thread: powerjob-worker-light-task-execute-4, connected at : 1758359324553, open stackTrace |
|
| 267 | + at java.lang.Thread.getStackTrace(Thread.java:1559) |
|
| 268 | + at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1498) |
|
| 269 | + at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5059) |
|
| 270 | + at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:726) |
|
| 271 | + at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5055) |
|
| 272 | + at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1407) |
|
| 273 | + at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1399) |
|
| 274 | + at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:100) |
|
| 275 | + at com.sie.snest.engine.db.relationdb.RelationDBAccessor.<init>(RelationDBAccessor.java:188) |
|
| 276 | + at com.sie.snest.engine.db.relationdb.TransactionRelationDBAccessor.<init>(TransactionRelationDBAccessor.java:40) |
|
| 277 | + at com.sie.snest.engine.a.a.getNewAccessorFromDataSource(AbstractDataSourceStrategy.java:126) |
|
| 278 | + at com.sie.snest.engine.a.a.getDbAccessor(AbstractDataSourceStrategy.java:109) |
|
| 279 | + at com.sie.snest.engine.a.h.getRelationDBAccessor(ModelMetaDataSourceStrategy.java:59) |
|
| 280 | + at com.sie.snest.engine.a.h.getRelationDBAccessor(ModelMetaDataSourceStrategy.java:32) |
|
| 281 | + at com.sie.snest.engine.data.access.BussModelDataAccess.getRelationDBAccessor(BussModelDataAccess.java:135) |
|
| 282 | + at com.sie.snest.engine.db.relationdb.FilterExpression.<init>(FilterExpression.java:443) |
|
| 283 | + at com.sie.snest.engine.data.access.BussModelDataAccess.a(BussModelDataAccess.java:2385) |
|
| 284 | + at com.sie.snest.engine.data.access.BussModelDataAccess.search(BussModelDataAccess.java:601) |
|
| 285 | + at sun.reflect.GeneratedMethodAccessor397.invoke(Unknown Source) |
|
| 286 | + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
|
| 287 | + at java.lang.reflect.Method.invoke(Method.java:498) |
|
| 288 | + at com.sie.snest.engine.model.MethodMeta.execute(MethodMeta.java:274) |
|
| 289 | + at com.sie.snest.engine.model.MethodMeta.invoke(MethodMeta.java:197) |
|
| 290 | + at com.sie.snest.engine.data.RecordSet.callSuper(RecordSet.java:476) |
|
| 291 | + at com.sie.snest.sdk.db.DbUtils.search(DbUtils.java:388) |
|
| 292 | + at com.sie.snest.sdk.BaseModel.search(BaseModel.java:351) |
|
| 293 | + at com.sie.snest.job.worker.model.JobInfo.search(JobInfo.java:282) |
|
| 294 | + at com.sie.snest.job.worker.model.JobInfo$$EnhancerByCGLIB$$edeee016.CGLIB$search$16(<generated>) |
|
| 295 | + at com.sie.snest.job.worker.model.JobInfo$$EnhancerByCGLIB$$edeee016$$FastClassByCGLIB$$e58b7ebf.invoke(<generated>) |
|
| 296 | + at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) |
|
| 297 | + at com.sie.snest.engine.model.ModelInterceptor.intercept(ModelInterceptor.java:84) |
|
| 298 | + at com.sie.snest.job.worker.model.JobInfo$$EnhancerByCGLIB$$edeee016.search(<generated>) |
|
| 299 | + at sun.reflect.GeneratedMethodAccessor562.invoke(Unknown Source) |
|
| 300 | + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
|
| 301 | + at java.lang.reflect.Method.invoke(Method.java:498) |
|
| 302 | + at com.sie.snest.engine.model.MethodMeta.execute(MethodMeta.java:274) |
|
| 303 | + at com.sie.snest.engine.model.MethodMeta.invoke(MethodMeta.java:204) |
|
| 304 | + at com.sie.snest.engine.api.distributed.MethodMetaInvoker.invokeFirstMethod(MethodMetaInvoker.java:23) |
|
| 305 | + at com.sie.snest.engine.api.distributed.RpcInvocationV2.invoke(RpcInvocationV2.java:168) |
|
| 306 | + at com.sie.snest.engine.data.RecordSet.call(RecordSet.java:360) |
|
| 307 | + at com.sie.snest.sdk.db.DbUtils.select(DbUtils.java:341) |
|
| 308 | + at com.sie.snest.sdk.BaseModel.select(BaseModel.java:314) |
|
| 309 | + at com.sie.snest.job.worker.processors.StandaloneProcessor.process(StandaloneProcessor.java:89) |
|
| 310 | + at tech.powerjob.worker.core.tracker.task.light.LightTaskTracker.processTask(LightTaskTracker.java:213) |
|
| 311 | + at java.util.concurrent.FutureTask.run(FutureTask.java:266) |
|
| 312 | + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) |
|
| 313 | + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) |
|
| 314 | + at java.lang.Thread.run(Thread.java:748) |
|
| 315 | +ownerThread current state is WAITING, current stackTrace |
|
| 316 | + at sun.misc.Unsafe.park(Native Method) |
|
| 317 | + at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) |
|
| 318 | + at java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1693) |
|
| 319 | + at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3323) |
|
| 320 | + at java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1729) |
|
| 321 | + at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895) |
|
| 322 | + at com.sie.snest.job.worker.processors.StandaloneProcessor.process(StandaloneProcessor.java:161) |
|
| 323 | + at tech.powerjob.worker.core.tracker.task.light.LightTaskTracker.processTask(LightTaskTracker.java:213) |
|
| 324 | + at tech.powerjob.worker.core.tracker.task.light.LightTaskTracker$$Lambda$2051/1714736853.call(Unknown Source) |
|
| 325 | + at java.util.concurrent.FutureTask.run(FutureTask.java:266) |
|
| 326 | + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) |
|
| 327 | + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) |
|
| 328 | + at java.lang.Thread.run(Thread.java:748) |
|
| 329 | +``` |
|
| 330 | + |
|
| 255 | 331 | |
| 256 | 332 | ## 4. 解决方式 |
| 257 | 333 | 如果是在线程中执行了SQL操作,那么需要业务代码自己手动的去创建meta和显示的调用 meta.close() |