В настоящее время я пытаюсь интегрировать 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;
}
, поэтому с запросом выше я ожидаю получитькак 40 из 100 отчетов хранятся.Я измерил время для запроса и активации, и это около 3,5 секунд!Для меня это кажется ОЧЕНЬ медленным!Я немного поиграл и удалил Comparator в своем запросе.Теперь у меня время выполнения около 1,2 секунды.Если я сортирую их вручную с помощью Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator)
, это выполняется за 47 миллилитров !!Я делаю что-то неправильно?По какой причине db4o любит занимать в 10 раз больше времени, чем Collections.sort ()?
Каков наилучший способ оптимизации моей модели для 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.Как я уже писал выше, мне кажется, что индексирование делает его МЕДЛЕННЫМ!