ANR in concurrent DB access

  • Replies:0
Gaurav Agrawal
  • Forum posts: 1

Mar 14, 2014, 4:19:46 PM via Website

I have used content provider in my project and override the applyBatch() for writting data into the database :

@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
final Context context = getContext();
final SQLiteDatabase db = getDatabase(context);
db.beginTransaction();
try {
final int numOperations = operations.size();
final ContentProviderResult[] results = new ContentProviderResult[numOperations];
for (int i = 0; i < numOperations; i++) {
results[i] = operations.get(i).apply(this, results, i);
}
db.setTransactionSuccessful();
return results;
} finally {
db.endTransaction();
}
}


If there is any writing operation to the database, applyBatch() method get called and in same time if I will make query from database(using CursorLoader), or call apply batch from different activity ANR comes and the following exception will also comes :

W/SQLiteConnectionPool(18025): The connection pool for database '+data+data+com.abc.xyz+databases+XYZ' has been unable to grant a connection to thread 8073 (pool-17-thread-3) with flags 0x2 for 64.105 seconds.
W/SQLiteConnectionPool(18025): Connections: 0 active, 1 idle, 0 available.

The above issue will not come if I remove the methode db.beginTrasaction() and db.endTrasaction() from applyBatch(). But in that case reading/writing time becomes large. I have used methods db.beginTrasaction() and db.endTrasaction() which reduces database access time to ten times.

Is there any approach, so that SQLite DataBse response quickly and there is no ANR ?

Reply