目前我正在尝试将db4o集成到我的应用程序中。我有一个模型,其中包含 - 比如15个基元 - 包含在其他对象中。存储它们既简单又快速,但收到它们就是痛苦。我尝试过NativeQuerys和SODA没有太大的区别。为了给它们中的一些提供索引,可以进一步降低查询速度。
示例中的:我的查询如下:
public List<DatabaseReport> getCurrentDeviationReportsOnly(){
final long now = System.currentTimeMillis();
return getDatabase().query(new Predicate<DatabaseReport>() {
@Override
public boolean match(DatabaseReport candidate) {
return candidate.getReport().getBegin().getMillis() < now
&& candidate.getReport().getEnd().getMillis() > now;
}
}, mTimeComparator);
mTimeComparator实现如下:
public static class DatabaseScheduleReportTimeComparator implements Comparator<DatabaseReport>{
@Override
public int compare(DatabaseReport object1,
DatabaseReport object2) {
long first = object1.getReport().getBegin().getMillis();
long second = object2.getReport().getBegin().getMillis();
if (first < second) return 1;
if (first > second) return -1;
else {
first = object1.getReport().getEnd().getMillis();
second = object2.getReport().getEnd().getMillis();
if (first > second) return 1;
if (first < second) return -1;
else return 0;
}
因此,通过上面的查询,我希望能够像存储的100个报告中的40个一样。我测量了查询和激活的时间,它大概是3,5秒!对我来说,这看起来非常慢!
我玩了一下,在查询中删除了比较器。现在我有大约1,2秒的执行时间。如果我用Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator)
手动对它们进行排序,它会在47 Millis中执行!难道我做错了什么? db4o比Collections.sort()花费的时间多10倍的原因是什么?
优化db4o模型的最佳方法是什么? (在这种情况下,Activatable没有用,因为ResultingList将在ListAdapter中传递,它需要每个成员。)
编辑:由于下面的答案,我也在这里插入我的SodaQuery:
public List<DatabaseReport> getCurrentDeviationReports(){
final Date now = new Date(System.currentTimeMillis());
Query query = getDatabase().query();
query.constrain(DatabaseReport.class);
query.descend("mReport").descend("begin").descend("datetime").constrain(now).smaller();
query.descend("mReport").descend("end").descend("datetime").constrain(now).greater();
query.descend("mReport").descend("begin").descend("datetime").orderAscending();
query.descend("mReport").descend("end").descend("datetime").orderDescending();
return query.execute();
}
所以这里的“datetime”是一个java.util.date对象。正如我上面所写的那样,在我看来,索引使它变得更快!
答案 0 :(得分:3)
有很多事情可能会出错。所以这是我的检查清单。