2016-11-08 4 views
0

Ich habe eine Datenbanktabelle mit ORMlite gemappt, es enthält einige Daten (18 Spalten) und es enthält auch ForeignCollectionField(eager = true).Wie beschleunigt man das eifrige Laden ausländischer Sammlungen?

Problem ist, wenn alle Daten aus dieser Tabelle geladen werden ... ORMlite erstellt Abfrage für jedes Element statt Joins. Dies führt zu 67124 Abfragen und dauert ewig, um alle Objekte aus dieser Tabelle zu laden.

Dies könnte jedoch in rechten Join-Abfrage unter wenigen Sekunden getan werden? Warum stattdessen Tausende von Abfragen generieren?

Wie kann ich es beschleunigen? Muss ich rohe Abfrage und dann RawRowMapper schreiben, was die Verwendung von ORM sinnlos macht.

Wie man mit dem Laden von eifrigen Sammlungen in Ormlite umgehen? Weil queryForAll nicht Art und Weise ist ..

+0

Warum versuchen Sie, alle Daten und wie zu laden? ORMs sind nicht für die Berichterstellung oder ETL gedacht. Dies sind die einzigen gültigen Gründe, "alle Daten zu laden". Verwenden Sie hierfür eine gespeicherte Prozedur oder Ansicht. Was du beschreibst, ist das 'N + 1'-Problem, das durch eifriges Laden behoben werden sollte. Wie machen Sie die Abfrage und wie haben Sie Zuordnungen definiert? –

+0

PS ORMs * wirklich, wirklich * sind nicht für die Berichterstattung oder ETL gedacht. Dies ist nur eine wissenschaftliche Diskussion. Sie erhalten nichts, wenn Sie Zeilen und Werte in Objekte konvertieren, wenn Sie keine Domänenlogik auf sie anwenden möchten. –

+0

In diesem Fall muss ich alle Daten laden, die später alle in 3D-Grafik angezeigt und für die Simulation verwendet werden ... Es gibt große Domain-Logik dahinter. Diese Tabelle hat viel mehr Spalten und ganze Datenbank hat viel mehr Tabellen .. aber dieses Mal muss ich alle laden und es langsam. Wie auch immer, auch wenn es keine große Domain-Logik und Sie laden alle Daten beim Start, Datenbank ist immer noch gut Weg um diese Daten zu speichern, da ihre Spalten zur Laufzeit aktualisiert werden können, anstatt die gesamte XML-Datei neu zu schreiben. –

Antwort

1

Problem ist, wenn alle Daten aus dieser Tabelle geladen ... ORMlite Abfrage für jedes Element schafft stattdessen mit beitritt. Dies führt zu 67124 Abfragen und dauert ewig, um alle Objekte aus dieser Tabelle zu laden.

Es ist ORM_Lite_ aus einem bestimmten Grund. Viele Leute haben um Unterstützung bei ausländischen Sammlungen gebeten, aber ich bin noch nicht dazu gekommen. Es ist nicht einfach.

Wenn Sie immer noch ORMLite verwenden möchten, würde ich nicht mit eager = true empfehlen und stattdessen 2 Abfragen durchführen. Eine Abfrage für Ihr Hauptelement und dann eine weitere Abfrage unter Verwendung des DAO, das der Sammlungseinheit zugeordnet ist, unter Verwendung von IN. Etwas wie:

qb = accountDao.queryBuilder(); 
qb.where()...; 
List<Account> accounts = qb.query(); 

// build a list of account-ids 
List<Long> accountIds = new ArrayList<>(); 
for (Account account : accounts) { 
    accountIds.add(account.getId()); 
} 

// now use this list of ids to get your other entities 
List<Order> orders = orderDao.queryBuilder().where().in("accountId", accountIds).query(); 
// now you have a list of orders for all of your ids 
// you will need to associate each order with its account 

Hoffe, dass dies hilft.

Verwandte Themen