2011-03-24 78 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