数据库连接池问题

在使用greendao时出现下面这个问题

W/SQLiteConnectionPool: The connection pool for database '/data/user/0/xxx' has been unable to grant a connection to thread 457 (Thread-11) with flags 0x1 for 630.02405 seconds.Connections: 0 active, 1 idle, 0 available.

一个db对象只有一个SQLiteConnectionPool,默认情况下只有一个数据库连接,除非有其他配置,具体分析可以参考http://bbs.51cto.com/thread-1113117-1.html,里面有很详细分析。这里主要记录一下本应用怎么出现的死锁。在一个线程(Thread1)中,调用beginTransaction(),在endTransaction之前某个方法(用A代替)加了同步锁标识,其他线程(Thread2)在某个时刻也会调用A方法,同时A方法中也需要去获取数据库连接(SQLiteConnection下同)操作,我们知道在beginTransaction,就会去获取数据库连接(SQLiteConnection下同),如果获取不到就等待固定时长再次获取,这样在上述逻辑执行中就会出现死锁问题。原因是如果Thread1先获取数据库连接,但是还未释放(释放是在endTransaction中处理),在还未调用A方法时,Thread2先调用了A方法,这时由于数据库连接被Thread1占用,就进入等待,而Thead1调用A方法时由于同步锁原因也无法执行下去,这就造成相互等待对方释放资源,从而造成死锁。伪代码如下:

synchronized A() {
    ...
    普通数据库操作(插入,删除等)
    ...
}

B() {
    ...//省略部分代码
    db.beginTransaction();
    ...
    
    A();//A方法被调用
    ...
    db.setTransactionSuccessful();
    ...
    db.endTransaction();
}

class Thread1 extends Thread {
    
    void run() {
        B();
    }

}

class Thread2 extends Thread {
    void run() {
        A();
    }
}

 

 

你可能感兴趣的:(android开发中问题)