将Dao作为静态成员存储在类中是否安全?

时间:2013-09-19 15:30:49

标签: java android database concurrency ormlite

我正在使用OrmLite来处理Android应用程序中的持久性。

OrmLite文档讨论了DAO Enabled Objects,并提供了一个类extend,告诉OrmLite您希望在从数据库检索的类的实例上设置Dao

这有一些很好的属性,比如让object.update()object.refresh() DTRT。

对于非数据库生成的对象,可以使用object.setDao(Dao)方法。

在开始时只是将Dao初始化为类的静态成员变量会不会有问题?

public class Order extends BaseDaoEnabled<Order, Integer> {
    protected static globalDao = null;
    public Order() {
        // Set non-static dao used by parent BaseDaoEnabled
        this.dao = globalDao;
    }

在程序的主要类中,我将使用适合该对象的Dao初始化globalDao一次。

即使没有访问OrmLiteSqliteOpenHelper.getDao(),这也可以让我们在给定类的实例的情况下进行数据库操作。

认为这是线程安全的,因为我读DaoManager表示每个类通常只有一个Dao。

1 个答案:

答案 0 :(得分:0)

[对不起,迟到的回复。 ]

  

在开始时只是将Dao初始化为类的静态成员变量会不会有问题?

是和否。您需要确保应用程序何时关闭DAO设置为null,以便在它返回时重新初始化。问题是我看到应用程序已停止,但类仍在内存中。然后,如果用户重新运行应用程序,则static初始化程序将重新实例化,并且旧版本的DAO现在已经与数据库建立了死锁。

正确的做法是反映DatabaseHelper class uses in the HelloAndroid project的行为。用它来解释:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

   private Dao<SimpleData, Integer> simpleDao = null;

   public Dao<SimpleData, Integer> getDao() throws SQLException {
       if (simpleDao == null) {
           simpleDao = getDao(SimpleData.class);
       }
       return simpleDao;
   }

   @Override
   public void close() {
       super.close();
       simpleDao = null;
   }