数据库连接池问题

在使用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();
    }
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值