\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()