Java 将Dao作为静态成员存储在类上是否安全?
我正在使用OrmLite处理Android应用程序中的持久性 OrmLite文档讨论了这个问题,并提供了一个可以扩展的类,告诉OrmLite您希望在从数据库检索的类的实例上设置Dao 这有一些很好的属性,比如允许object.update和object.refresh DTRT 对于非数据库生成的对象,可以使用object.setDaoDao方法 相反,在开始时将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<
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;
}
如果我的回答对你有帮助,记得接受它。谢谢