2011-03-24 69 views
4

我有一个看起来像这样为什么在ORMLite中DAO方法如此之慢?

public Dao<ModelStore, Integer> getDaoStore() throws SQLException { 
    return BaseDaoImpl.createDao(getConnectionSource(), ModelStore.class); 
} 

当我打电话getDaoStore这是一个相当漫长的过程的方法。在我的日志中,我可以看到GC在每次调用之后都会运行,所以我猜这次调用有很多事情要做。

有没有办法加快速度?

+0

这个调用返回什么?数据库中的对象的连续数?在这种情况下,您应该限制从数据库加载的数据量。 – Gamlor 2011-03-25 12:07:28

+0

@Gamlor这个调用返回一个DAO对象,该对象将作用于给定的模型以执行各种数据库任务,例如插入,更新,查询等... – Pzanno 2011-03-25 14:24:27

+0

Hey @Pzanno。我已经更新了我的回应,下面介绍了Android下的'createDao'如此之慢的真正原因。 – Gray 2011-09-15 16:08:07

回答

8

的Android的土地深刻检查显示,因为总Method.equals()方法而言,Android系统下的注解是非常缓慢,非常 GC密集。我们在4.26版本中添加了表格配置文件,绕过了这一点,使ORMLite启动更快,速度更快。请参阅邮件列表上的this questionthis thread

我们不断提高注释速度。另请参阅:ORMLite poor performance on Android?


DAO创建是一个相对昂贵的过程。 ORMLite创建类和类中的字段的数据表示,并构建大量其他实用程序类,以帮助实现各种DAO功能。您应确保每次调用时调用createDao方法一次。我认为这是在Android @Pzanno下?

在4.16中,我们增加了一个DaoManager,他的工作是缓存Dao类,并在4.20版本中进行了改进。您应该始终使用它来创建您的Daos。推荐如下代码:

private Dao<ModelStore, Integer> modelStoreDao = null; 
... 

public Dao<ModelStore, Integer> getDaoStore() throws SQLException { 
    if (modelStoreDao == null) { 
     modelStoreDao = DaoManager.createDao(getConnectionSource(), 
      ModelStore.class); 
    } 
    return modelStoreDao; 
} 

希望这会有所帮助。 ORMLite的内存审计也可能是有序的。自从我看到它的消费已经有一段时间了。

+0

@格雷谢谢!现在在你的例子中,你还将自己作为一个班级的私人成员缓存。这是否需要,因为你说DaoManager会为你缓存? – Pzanno 2011-03-25 14:25:38

+0

@Gray另外,如果最好是缓存自己,你会建议把它变成一个静态变量吗?或者会消耗太多内存? – Pzanno 2011-03-25 14:34:53

+0

@Gray我刚刚从4.16测试了新的DaoManager类,我不能说我注意到它应该做的缓存。另外在我的Android日志中,我得到了这样的信息:'03-25 15:21:33.022:INFO/dalvikvm(8157):找不到方法java.sql.SQLException。 ,在使用TableUtils类创建表的过程中,使用方法com.j256.ormlite.dao.DaoManager.createDao 引用。 – Pzanno 2011-03-25 15:23:51

相关问题