【问题标题】:Slow update with OrmLiteOrmLite 更新缓慢
【发布时间】:2011-07-12 08:39:27
【问题描述】:

我有一个简单的结构,我注意到更新数据库中的记录需要很长时间才能执行。

这是我的数据类的定义方式:

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() 需要几秒钟,它应该立即执行。

任何想法都会很棒。

【问题讨论】:

  • 我的回答对你有帮助吗@no9?

标签: android sqlite performance ormlite


【解决方案1】:

我看到的唯一内容是 byte[] image_data; 字段可能包含一些巨大的价值,这会减慢速度。但是您显示的更新甚至没有触及image_data 字段,所以我不知道为什么要花这么长时间。

我建议在 ORMLite 中启用一些日志记录,看看您是否可以弄清楚时间的去向。见http://ormlite.com/docs/logging

此外,您在此表中有很多索引,包括byte[] image_data 上的索引。除非确实有必要,否则您可能会考虑删除其中一些索引。

【讨论】:

  • 部分。问题是在某些手机上运行正常,而在某些手机上运行缓慢。
  • 如果您找出差异,请告诉我。
  • 如果您使用的是 Log4j,那么您可以将 log4j.properties 文件放在您的 src/main/resources 中。日志记录文档提供了一些示例:ormlite.com/docs/logging
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 2011-01-02
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多