Autore Topic: Reached MAX size for compiled-sql statement cache for database  (Letto 914 volte)

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
Reached MAX size for compiled-sql statement cache for database
« il: 22 Luglio 2011, 16:51:14 CEST »
0
Ciao a tutti,
Eseguendo una sincronizzazione di dati da un SqlServer remoto ad un SQLite locale ottengo il seguente warning:
Codice: [Seleziona]
W/Database( 7092): Reached MAX size for compiled-sql statement cache for database /data/data/net.edisoft.ediflash/databases/incassi; i.e., NO space for this sql statement in cache: UPDATE schede SET codiceInterno=?, codiceAAMS=?, codLocale=?, nomeGioco=?, codConcessionario=? WHERE _id=3163. Please change your sql statements to use '?' for bindargs, instead of using actual values
L'importazione sembra essere andata a buon fine, ma non capisco cosa significhi l'errore. Il codice che si occupa di fare le query di update é il seguente:

Codice (Java): [Seleziona]
        public boolean updateScheda(long rowId, String nomeGioco,
                        String codiceInterno, String codiceAAMS, String codLocale,
                        String codConcessionario) {
                // Preparo il ContentValues con dati da inserire
                ContentValues args = new ContentValues();
                args.put(KEY_SCHEDE_NOME_GIOCO, nomeGioco);
                args.put(KEY_SCHEDE_CODICE_INTERNO, codiceInterno);
                args.put(KEY_SCHEDE_CODICE_AAMS, codiceAAMS);
                args.put(KEY_SCHEDE_COD_LOCALE, codLocale);
                args.put(KEY_SCHEDE_COD_CONCESSIONARIO, codConcessionario);
                // Update
                return mDb.update(DATABASE_TABLE_SCHEDE, args, KEY_LOCALI_ROWID + "="
                                + rowId, null) > 0;
        }

Posso ignorare il Warning, o devo preoccuparmi?
--
g4b0, linux user n. 369000
http://brosulo.net

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Reached MAX size for compiled-sql statement cache for database
« Risposta #1 il: 22 Luglio 2011, 20:10:59 CEST »
0
Prova a cambiare il codice in questo modo:

Codice (Java): [Seleziona]
mDb.update(DATABASE_TABLE_SCHEDE, args, KEY_LOCALI_ROWID + "= ?", new String[]{String.valueOf(rowId)}) > 0;

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
Re:Reached MAX size for compiled-sql statement cache for database
« Risposta #2 il: 25 Luglio 2011, 09:44:10 CEST »
0
Il tuo codice funziona, ma continua sempre a darmi lo stesso warning. Quello che sta facendo l'activity in quel momento é un importazione di parecchi record da un db SQLServer verso il db locale SQLite. É un Async Task che gira per una quarantina di secondi circa, con tanto di progress bar.

Per completezza riporto il log completo dall'inizio alla fine:
Codice: [Seleziona]
D/ListLocali SYNC( 3375): START Syncronization
D/dalvikvm( 3375): GC_FOR_MALLOC freed 3351 objects / 222856 bytes in 136ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 4236 objects / 173600 bytes in 125ms
D/dalvikvm(  253): GC_EXPLICIT freed 46 objects / 2224 bytes in 118ms
I/ActivityManager(   66): Process com.android.email (pid 224) has died.
D/dalvikvm( 3375): GC_FOR_MALLOC freed 10613 objects / 458432 bytes in 161ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8908 objects / 410056 bytes in 122ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9971 objects / 500800 bytes in 162ms
W/Database( 3375): Reached MAX size for compiled-sql statement cache for database /data/data/net.edisoft.ediflash/databases/incassi; i.e., NO space for this sql statement in cache: SELECT DISTINCT _id, nomeGioco, codiceInterno, codiceAAMS, codLocale, codConcessionario FROM schede WHERE _id=6774. Please change your sql statements to use '?' for bindargs, instead of using actual values
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11421 objects / 564728 bytes in 144ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9531 objects / 465024 bytes in 146ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8902 objects / 474176 bytes in 123ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7777 objects / 488112 bytes in 128ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8073 objects / 539824 bytes in 211ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11438 objects / 686552 bytes in 140ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9629 objects / 508464 bytes in 123ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 6794 objects / 397304 bytes in 132ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11497 objects / 678184 bytes in 178ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8585 objects / 494928 bytes in 206ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7484 objects / 448608 bytes in 153ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 10054 objects / 588648 bytes in 151ms
D/ListLocali SYNC( 3375): START Syncronization
D/dalvikvm( 3375): GC_FOR_MALLOC freed 3351 objects / 222856 bytes in 136ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 4236 objects / 173600 bytes in 125ms
D/dalvikvm(  253): GC_EXPLICIT freed 46 objects / 2224 bytes in 118ms
I/ActivityManager(   66): Process com.android.email (pid 224) has died.
D/dalvikvm( 3375): GC_FOR_MALLOC freed 10613 objects / 458432 bytes in 161ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8908 objects / 410056 bytes in 122ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9971 objects / 500800 bytes in 162ms
W/Database( 3375): Reached MAX size for compiled-sql statement cache for database /data/data/net.edisoft.ediflash/databases/incassi; i.e., NO space for this sql statement in cache: SELECT DISTINCT _id, nomeGioco, codiceInterno, codiceAAMS, codLocale, codConcessionario FROM schede WHERE _id=6774. Please change your sql statements to use '?' for bindargs, instead of using actual values
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11421 objects / 564728 bytes in 144ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9531 objects / 465024 bytes in 146ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8902 objects / 474176 bytes in 123ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7777 objects / 488112 bytes in 128ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8073 objects / 539824 bytes in 211ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11438 objects / 686552 bytes in 140ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9629 objects / 508464 bytes in 123ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 6794 objects / 397304 bytes in 132ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11497 objects / 678184 bytes in 178ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8585 objects / 494928 bytes in 206ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7484 objects / 448608 bytes in 153ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 10054 objects / 588648 bytes in 151ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7885 objects / 455304 bytes in 135ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9316 objects / 557464 bytes in 134ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9704 objects / 561688 bytes in 163ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8844 objects / 498168 bytes in 184ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9859 objects / 552168 bytes in 140ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 8666 objects / 487528 bytes in 141ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 9174 objects / 538928 bytes in 129ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 11246 objects / 617048 bytes in 153ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7109 objects / 433080 bytes in 296ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7890 objects / 518192 bytes in 128ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 7197 objects / 498696 bytes in 123ms
D/dalvikvm( 3375): GC_FOR_MALLOC freed 10007 objects / 647032 bytes in 231ms
D/ListLocali( 3375): STOP Syncronization

Questo warning non mi turba un granché, anche perché apparentemente i dati ci sono tutti. Ora peró approfondisco, non vorrei che si perda qualche recor qua e la  8-)

[edit]
Mi accorgo solo ora che il warning non riguarda piú l'update di cui sopra, ma una fantomatica SELECT DISTINCT. Ho peró cercato in tutto il codice e non ho alcun SELECT DISTINCT :-/
« Ultima modifica: 25 Luglio 2011, 09:47:52 CEST da g4b0 »
--
g4b0, linux user n. 369000
http://brosulo.net

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Reached MAX size for compiled-sql statement cache for database
« Risposta #3 il: 25 Luglio 2011, 10:47:38 CEST »
0
Se devi fare un grosso numero di update ti consiglio di utilizzare i compiled statement:

1) Scrivi la tua query utilizzando i vari ? e ottieni un oggetti di tipo SQLiteStatement tramite il metodo http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#compileStatement(java.lang.String)

2)Per ogni record di cui devi fare l'update fai il bind dei parametri tramite i vari metodi bind* della classe SQLiteStatement e lo esegui.

Fammi sapere il gap prestazionale ;)

Offline g4b0

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
    • gabo 3.0
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    Debian Testing
Re:Reached MAX size for compiled-sql statement cache for database
« Risposta #4 il: 12 Agosto 2011, 16:10:40 CEST »
0
Ci ho provato, ma mi restituisce un errore:

Codice: [Seleziona]
Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor.
stmt.close lo chiamo alla fine dell'update, ma pare non accorgersene...

      
Codice (Java): [Seleziona]
SQLiteStatement stmt = mDb.compileStatement(
                 "UPDATE " + DATABASE_TABLE_SCHEDE + " SET " +
                 KEY_SCHEDE_NOME_GIOCO + "= ?, " +
                 KEY_SCHEDE_CODICE_INTERNO + "= ?," +
                 KEY_SCHEDE_CODICE_AAMS + "= ?," +
                 KEY_SCHEDE_COD_LOCALE + "= ?," +
                 KEY_SCHEDE_COD_CONCESSIONARIO + "= ?," +
                 KEY_SCHEDE_TIPO_INCASSO + "= ?," +
                 KEY_SCHEDE_PERC_LOC + "= ?," +
                 KEY_SCHEDE_TIPO_RETE + "= ?," +
                 KEY_SCHEDE_VAL_RETE + "= ?," +
                 KEY_SCHEDE_CN_TOT_IN + "= ?," +
                 KEY_SCHEDE_CN_TOT_OUT + "= ?," +
                 KEY_SCHEDE_ULTIMO_INCASSO + "= ? " +
                 "WHERE _id = ?"
                 );
                 stmt.bindString(1, nomeGioco);
                 stmt.bindString(2, codiceInterno);
                 stmt.bindString(3, codiceAAMS);
                 stmt.bindString(4, codLocale);
                 stmt.bindString(5, codConcessionario);
                 stmt.bindString(6, tipoIncasso);
                 stmt.bindDouble(7, percLoc);
                 stmt.bindString(8, tipoRete);
                 stmt.bindDouble(9, valRete);
                 stmt.bindDouble(10, in);
                 stmt.bindDouble(11, out);
                 stmt.bindLong(12, ultimoIncasso);
                 stmt.bindLong(12, rowId);
                 stmt.execute();
                 stmt.close();
--
g4b0, linux user n. 369000
http://brosulo.net