Медленное обновление с OrmLite - PullRequest
0 голосов
/ 12 июля 2011

У меня простая структура, и я заметил, что обновление записей в моей базе данных занимает слишком много времени.

Вот как определяется мой класс данных:

public static final String TILE_MAP_UNIQUE_ID_FIELD_NAME = "tileMap_unique_id"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false)
int tileMap_unique_id;
public static final String TILE_MAP_LEVEL_ID_FIELD_NAME = "tileMap_level_id"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false)
String tileMap_level_id;
public static final String COLUMN_FIELD_NAME = "column"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false)
long column;
public static final String ROW_FIELD_NAME = "row";
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false)
long row;
public static final String IMAGE_DATA_FIELD_NAME = "image_data";
@DatabaseField (dataType = DataType.BYTE_ARRAY, index = true, canBeNull = false)
byte[] image_data;
public static final String IMAGE_DATA_LENGHT_FIELD_NAME = "image_data_lenght";
@DatabaseField (index = true, canBeNull = false)
int image_data_lenght;
public static final String DATE_CREATED_FIELD_NAME = "date_created";
@DatabaseField(index = true, canBeNull = false)
Date date_created;
public static final String DATE_LAST_ACCESSED_FIELD_NAME = "date_last_accessed";
@DatabaseField(index = true, canBeNull = false)
Date date_last_accessed;
public static final String ACCESSED_COUNTER = "accessed_counter";
@DatabaseField(index = true, canBeNull = false)
int accessed_counter;

И этооператор обновления где-то в моем приложении:

Dao<TileMapCacheData, Integer> updateTileMapCacheDataDao = dbHelper.getTileMapCacheDataDao();
UpdateBuilder<TileMapCacheData, Integer> updateBuilder = updateTileMapCacheDataDao.updateBuilder();
updateBuilder.updateColumnValue(TileMapCacheData.DATE_LAST_ACCESSED_FIELD_NAME, new Date());
updateBuilder.updateColumnValue(TileMapCacheData.ACCESSED_COUNTER, record.accessed_counter + 1);
updateBuilder.where()
.eq(TileMapCacheData.TILE_MAP_UNIQUE_ID_FIELD_NAME, tileMap.getUniqueId())
.and()
.eq(TileMapCacheData.TILE_MAP_LEVEL_ID_FIELD_NAME, tileMap.getLevelId(tileImage.tile.level))
.and()
.eq(TileMapCacheData.COLUMN_FIELD_NAME, tileImage.tile.column)
.and()
.eq(TileMapCacheData.ROW_FIELD_NAME, tileImage.tile.row);
updateTileMapCacheDataDao.update(updateBuilder.prepare());

SQL выглядит так:

UPDATE `tilemapcachedata` SET `date_last_accessed` = ? ,`accessed_counter` = 11 WHERE (((`tileMap_unique_id` = -1902272760 AND `tileMap_level_id` = '5' ) AND `column` = 24 ) AND `row` = -6 )

Кто-нибудь видит, где проблема?.Update () занимает несколько секунд, и он должен быть выполнен мгновенно.

Любая идея будет отличной.

1 Ответ

2 голосов
/ 15 июля 2011

Единственное, что я вижу, это поле byte[] image_data;, которое может содержать какое-то огромное значение, которое замедляет процесс.Но показанное вами обновление даже не касается поля image_data, поэтому я понятия не имею, почему оно занимает так много времени.

Я бы порекомендовал включить некоторые записи в ORMLite, чтобы посмотреть, сможете ли вы выяснить, гдевремя идетСм. http://ormlite.com/docs/logging

Кроме того, в этой таблице много индексов, включая индекс byte[] image_data.Вы можете удалить некоторые из этих индексов, если они действительно не нужны.

...