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

Java 将Dao作为静态成员存储在类上是否安全?,java,android,database,concurrency,ormlite,Java,Android,Database,Concurrency,Ormlite,我正在使用OrmLite处理Android应用程序中的持久性 OrmLite文档讨论了这个问题,并提供了一个可以扩展的类,告诉OrmLite您希望在从数据库检索的类的实例上设置Dao 这有一些很好的属性,比如允许object.update和object.refresh DTRT 对于非数据库生成的对象,可以使用object.setDaoDao方法 相反,在开始时将Dao初始化为类上的静态成员变量会有问题吗 public class Order extends BaseDaoEnabled<

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

OrmLite文档讨论了这个问题,并提供了一个可以扩展的类,告诉OrmLite您希望在从数据库检索的类的实例上设置Dao

这有一些很好的属性,比如允许object.update和object.refresh DTRT

对于非数据库生成的对象,可以使用object.setDaoDao方法

相反,在开始时将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


我认为这是线程安全的,因为我对的阅读表明,通常每个类都只有一个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被设置为null,以便在它返回时重新初始化。问题是,我看到应用程序已经停止,但类仍然在内存中。然后,如果用户重新运行应用程序,静态初始值设定项将不会被重新实例化,并且DAO的旧版本(现在与数据库的连接已断开)将就位

正确的做法是反映用户的行为。换言之:

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;
   }

如果我的回答对你有帮助,记得接受它。谢谢