[未解决]The connection pool for database has been unable to grant a connection to thread 1304

来源:互联网 发布:php教材推荐 编辑:程序博客网 时间:2024/06/03 13:18


11-11 09:49:44.783 481-496/system_process E/ActivityManager: ANR in com.wbm.app.activity (com.wbm.app.activity/.MainActivity)
                                                             PID: 12114
                                                             Reason: Input dispatching timed out (Waiting because the focused window has not finished processing the input events that were previously delivered to it.)
                                                             Load: 0.21 / 0.25 / 0.25
                                                             CPU usage from 11106ms to 0ms ago:
                                                               7.2% 549/com.android.systemui: 5.6% user + 1.5% kernel / faults: 217 minor
                                                               4.6% 170/surfaceflinger: 1.8% user + 2.8% kernel
                                                               1.6% 481/system_server: 0.9% user + 0.7% kernel / faults: 116 minor
                                                               1.2% 19332/kworker/2:2: 0% user + 1.2% kernel
                                                               1% 84/fb-vsync: 0% user + 1% kernel
                                                               0.7% 18843/kworker/0:1: 0% user + 0.7% kernel
                                                               0.6% 82/fb-vsync: 0% user + 0.6% kernel
                                                               0.5% 34/kconsole: 0% user + 0.5% kernel
                                                               0% 142/file-storage: 0% user + 0% kernel
                                                               0.3% 8/rcu_preempt: 0% user + 0.3% kernel
                                                               0.2% 86/cfinteractive: 0% user + 0.2% kernel
                                                               0.2% 854/com.youzan.cashier: 0% user + 0.1% kernel / faults: 1 minor
                                                               0.2% 19307/kworker/u8:1: 0% user + 0.2% kernel
                                                               0.1% 135/kworker/0:1H: 0% user + 0.1% kernel
                                                               0.1% 139/dhd_dpc: 0% user + 0.1% kernel
                                                               0.1% 177/lcdparamservice: 0% user + 0.1% kernel
                                                               0.1% 1391/com.qima.kdt:pushservice: 0% user + 0% kernel / faults: 11 minor
                                                               0.1% 1666/com.happy.activity: 0% user + 0% kernel
                                                               0% 1//init: 0% user + 0% kernel / faults: 14 minor
                                                               0% 83/rk-fb: 0% user + 0% kernel
                                                               0% 85/rk-fb: 0% user + 0% kernel
                                                               0% 138/dhd_watchdog_th: 0% user + 0% kernel
                                                               0% 167/netd: 0% user + 0% kernel / faults: 5 minor
                                                               0% 980/com.youzan.cashier:pushservice: 0% user + 0% kernel
                                                               0% 1693/com.happy.activity:remote: 0% user + 0% kernel
                                                               0% 8943/com.qima.kdt: 0% user + 0% kernel
                                                               0% 9005/com.sohu.inputmethod.sogou:classic: 0% user + 0% kernel
                                                               0% 12114/com.wbm.app.activity: 0% user + 0% kernel
                                                               0% 12133/kworker/1:1: 0% user + 0% kernel
                                                               0% 14653/android.process.media: 0% user + 0% kernel / faults: 6 minor
                                                               0% 18081/kworker/u9:1: 0% user + 0% kernel
                                                               0% 20463/wpa_supplicant: 0% user + 0% kernel
                                                             4.2% TOTAL: 2.2% user + 1.9% kernel + 0% iowait
                                                             CPU usage from 3107ms to 3617ms later:
                                                               3.7% 481/system_server: 0% user + 3.7% kernel / faults: 1 minor
                                                                 5.6% 496/ActivityManager: 0% user + 5.6% kernel
                                                               1.3% 8/rcu_preempt: 0% user + 1.3% kernel
                                                               1.4% 170/surfaceflinger: 0% user + 1.4% kernel
                                                             0.5% TOTAL: 0% user + 0.5% kernel

11-11 09:49:44.823 481-496/system_process D/InputEventConsistencyVerifier: KeyEvent: ACTION_UP but key was not down.
                                                                             in android.view.ViewRootImpl@426d3780
                                                                             0: sent at 778352501000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_NOTIFICATION, scanCode=143, metaState=0, flags=0x8, repeatCount=0, eventTime=778352501, downTime=778352500, deviceId=0, source=0x101 }
11-11 09:49:58.853 12114-12392/com.wbm.app.activity W/SQLiteConnectionPool: The connection pool for database '/data/data/com.wbm.app.activity/databases/cashierDB.db' has been unable to grant a connection to thread 1304 (pool-5-thread-3) with flags 0x1 for 13740.74 seconds.//大概4小时
                                                                            Connections: 0 active, 1 idle, 0 available.
11-11 09:50:28.853 12114-12392/com.wbm.app.activity W/SQLiteConnectionPool: The connection pool for database '/data/data/com.wbm.app.activity/databases/cashierDB.db' has been unable to grant a connection to thread 1304 (pool-5-thread-3) with flags 0x1 for 13770.741 seconds.
                                                                            Connections: 0 active, 1 idle, 0 available.
11-11 09:50:58.863 12114-12392/com.wbm.app.activity W/SQLiteConnectionPool: The connection pool for database '/data/data/com.wbm.app.activity/databases/cashierDB.db' has been unable to grant a connection to thread 1304 (pool-5-thread-3) with flags 0x1 for 13800.744 seconds.
                                                                            Connections: 0 active, 1 idle, 0 available.
11-11 09:51:28.863 12114-12392/com.wbm.app.activity W/SQLiteConnectionPool: The connection pool for database '/data/data/com.wbm.app.activity/databases/cashierDB.db' has been unable to grant a connection to thread 1304 (pool-5-thread-3) with flags 0x1 for 13830.745 seconds.
                                                                            Connections: 0 active, 1 idle, 0 available.
11-11 09:51:58.863 12114-12392/com.wbm.app.activity W/SQLiteConnectionPool: The connection pool for database '/data/data/com.wbm.app.activity/databases/cashierDB.db' has been unable to grant a connection to thread 1304 (pool-5-thread-3) with flags 0x1 for 13860.747 seconds.

                                                                            Connections: 0 active, 1 idle, 0 available


出现原因:

这个主要是我们在使用事务里面进行的数据库操作的时候,如果操作的时间比较长,例如我这里的有一个查询一个表里面所有的数组的时候耗时20毫秒,正好其他的地方如果也进行数据库操作,那么就会报这样的错误。

例如这里是模拟测试的:

 Log.e("kodulf","start");                        ThreadPoolUtils.execute(new Runnable() {                            @Override                            public void run() {                                ServiceContext.getCarriageTransactionTemplate().execute(new CarriageTransactionAction() {                                   @Override                                   public void doInTransaction(CarriageTransactionStatus status) throws Exception {                                       Log.e("kodulf","start transaction findall");                                       List<CashierAd> cashierAdList = DataSupport.findAll(CashierAd.class);                                       Log.e("kodulf","end transaction findall");                                                                    }                               });                            }                        });                        Log.e("kodulf","start normal findall");                        List<CashierAd> cashierAdList = DataSupport.findAll(CashierAd.class);                        Log.e("kodulf","end normal findall");


解决办法:

使用同步助手CountDownLatch把事务的操作抱起来,如果它执行1秒钟那么就直接跳出,

final CountDownLatch latch = new CountDownLatch(1);                        ThreadPoolUtils.execute(new Runnable() {                            @Override                            public void run() {                                ServiceContext.getCarriageTransactionTemplate().execute(new CarriageTransactionAction() {                                   @Override                                   public void doInTransaction(CarriageTransactionStatus status) throws Exception {                                       Log.e("kodulf","start transaction findall");                                       List<CashierAd> cashierAdList = DataSupport.findAll(CashierAd.class);                                       Log.e("kodulf","end transaction findall");                                       latch.countDown();                                   }                               });                            }                        });                        try {                            latch.await(1000, TimeUnit.MILLISECONDS);//3分钟超时                        } catch (InterruptedException e) {                        }                        Log.e("kodulf","start normal findall");                        List<CashierAd> cashierAdList = DataSupport.findAll(CashierAd.class);                        Log.e("kodulf","end normal findall");


+++++++++++++++++++++++++++++++++++++Debug的过程+++++++++++++++++++++++++++++++++++++++++

0:首先通过Android Device Monitor

Tools->Android->Anroid Device Monitory

1:选中我们的应用,然后点击Update Thread 的按钮,然后点击右边的Threads,查看我们的应用的各种线程

:



2:然后我们可以通过点击某一个线程来查看该线程的详细的信息,例如


3:我这里的线程的列表:

IDTidStatusutimestimeName112114Monitor21064017633main*212118VmWait325792GC*312119VmWait117Signal Catcher*412120Runnable60104JDWP*512121VmWait634484Compiler*612122Wait10212ReferenceQueueDaemon*712123Wait55774FinalizerDaemon*812124Wait24FinalizerWatchdogDaemon912125Native468453Binder_11012126Native414511Binder_21112134Native51TbsHandlerThread1212142Wait00pool-1-thread-11312139Native585559WifiManager1412143Wait00pool-1-thread-21518492Monitor40OkHttp http://tp.api.500mi.com:8080/gateway/api1617675Monitor2450814pool-5-thread-81712150Wait00pool-2-thread-11816523Monitor60302166pool-5-thread-51912153Wait00AsyncTask #12012154Wait00AsyncTask #22112228Wait00AsyncTask #3*2212236Wait4536Okio Watchdog2312240Wait00AsyncTask #42412244Wait00AsyncTask #52512375Wait00pool-4-thread-12612377Monitor188965931pool-5-thread-12712378Monitor186856034pool-5-thread-22812379Monitor302Thread-12922912380Monitor943104Thread-12933012381Monitor598181Thread-12943112382Monitor1097375Thread-12953212384Monitor1053366Thread-12963312385Monitor569192Thread-12973412386Monitor588213Thread-12983512387Monitor610197Thread-12993612388Monitor618211Thread-13003718493Monitor71OkHttp http://tp.api.500mi.com:8080/gateway/api3812390Monitor962116Thread-13023912391Monitor304Thread-13034012392TimedWait188296016pool-5-thread-34216708Monitor54721899pool-5-thread-64312395Wait00pool-3-thread-14412399Wait00pool-1-thread-34512400Wait00pool-1-thread-44612403Native10hwuiTask24712402Native20hwuiTask14812405Monitor186585983pool-5-thread-44912407Native429494Binder_35016709Monitor57311849pool-5-thread-7

4:然后查看到三个线程有问题:

第一是main的线程:这里面发现在findCashierAdRecodesFromDB 这个方法里面停住了,这里正是在做一个数据库的查询的操作

  at org.litepal.crud.DataSupport.where(DataSupport.java:152)  at com.wbm.app.business.service.CashierAdService.findCashierAdRecordsFromDB(CashierAdService.java:228)  at com.wbm.app.business.service.CashierAdService.sycnCashierAdRecords(CashierAdService.java:197)  at com.wbm.app.activity.MainActivity$1$4.run(MainActivity.java:278)  at java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy.rejectedExecution(ThreadPoolExecutor.java:1988)  at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)  at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)  at com.wbm.app.utils.ThreadPoolUtils.execute(ThreadPoolUtils.java:28)  at com.wbm.app.activity.MainActivity$1.handleMessage(MainActivity.java:275)  at android.os.Handler.dispatchMessage(Handler.java:98)  at android.os.Looper.loop(Looper.java:136)  at android.app.ActivityThread.main(ActivityThread.java:5008)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:811)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:627)  at dalvik.system.NativeStart.main(Native Method)


第二是pool-5-thread-3

  at java.lang.Object.wait(Native Method)  at java.lang.Thread.parkFor(Thread.java:1205)  at sun.misc.Unsafe.park(Unsafe.java:325)  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)  at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:670)  at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)  at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:586)  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1238)  at org.litepal.crud.DataHandler.query(DataHandler.java:124)  at org.litepal.crud.QueryHandler.onFindAll(QueryHandler.java:122)  at org.litepal.crud.DataSupport.findAll(DataSupport.java:629)  at org.litepal.crud.DataSupport.findAll(DataSupport.java:610)  at com.wbm.app.business.schedule.ErrorSchedule$1.run(ErrorSchedule.java:42)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  at java.lang.Thread.run(Thread.java:841)

第三:最关键的是Tid是18493这个,这个的Tid就是最后一个执行的时候出现的id,那么我们就认为是这里除了问题导致停止运行的。而这个正是在事务里面执行的数据库操作的那一步



  at org.litepal.crud.DataSupport.where(DataSupport.java:152)  at com.wbm.app.business.service.CashierAdService$1$1.doInTransaction(CashierAdService.java:82)  at com.wbm.app.business.transaction.CarriageTransactionTemplate.execute(CarriageTransactionTemplate.java:21)  at com.wbm.app.business.service.CashierAdService$1.onResponse(CashierAdService.java:66)  at com.wbm.app.business.service.CashierAdService$1.onResponse(CashierAdService.java:41)  at com.wbm.app.business.net.BopHttpClient$3.onResponse(BopHttpClient.java:172)  at com.wbm.app.business.net.BopHttpClient$1.onResponse(BopHttpClient.java:78)  at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)  at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  at java.lang.Thread.run(Thread.java:841)


4:确定了问题就是doTransaction这里的这一步的问题,然后最后发现了原因

这个主要是我们在使用事务里面进行的数据库操作的时候,如果操作的时间比较长,例如我这里的有一个查询一个表里面所有的数组的时候耗时20毫秒,正好其他的地方如果也进行数据库操作,那么就会报这样的错误。


5: 但是这个CountDownLatch 是阻塞的当前的线程,如果出现多个线程的情况的话,这里暂时是将这个事务放在主线程里面去执行的:

public class CarriageTransactionTemplate {    private Handler handler;    public void execute(final CarriageTransactionAction action) {        this.execute(action,true);    }    public void execute(final CarriageTransactionAction action,boolean runInMain) {        if(runInMain){            if(Looper.myLooper()!=Looper.getMainLooper()) {                if (handler == null) {                    handler = new Handler(Looper.getMainLooper());                }                //非主线程,并且子线程后续操作依赖事务处理的结果。                final CountDownLatch latch=new CountDownLatch(1);                handler.post(new Runnable() {                    @Override                    public void run() {                        _execute(action);                        latch.countDown();                    }                });                try {                    latch.await(1000*60, TimeUnit.MILLISECONDS);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }else{                _execute(action);            }        }else{            _execute(action);        }    }    private void _execute(CarriageTransactionAction action){        SQLiteDatabase db = Connector.getDatabase();        db.beginTransaction();        try {            CarriageTransactionStatus status = new CarriageTransactionStatus();            action.doInTransaction(status);            if(!status.isRollbackOnly()){                db.setTransactionSuccessful();            }        } catch (Exception var6) {            throw new DataSupportException(var6.getMessage());        } finally {            db.endTransaction();        }    }}













0 0
原创粉丝点击