2012-07-24 19 views
7

Nehmen wir an, ich habe folgendes Objekt:ORMLite LazyForeignCollection: Wie kann eine Sammlung nur einmal abgefragt werden?

public class MyOwnList { 

    @DatabaseField(id= true) 
    protected int id; 

    @ForeignCollectionField(eager = false) 
    protected Collection<Item> items; 
} 

Als items als faul markiert ist, wird es nicht, wenn ich aus der Datenbank die Liste Objekt laden geladen werden. Das ist genau was ich will !!

Das Problem ist, dass jedes Mal, wenn ich auf items zugreifen, ORMLite macht eine SQL-Abfrage, um die Sammlung zu erhalten. Wird erst nach Aktivierung der Protokollierung von ORMLite ... entdeckt.

Warum macht es das? Irgendein guter Grund dafür?

Gibt es eine Möglichkeit, dass ich die Sammlung lazy laden kann, aber nur einmal, nicht jedes Mal, wenn ich auf die Sammlung zugreifen? Also etwas zwischen eifrig und faul?

+1

Nun, der Name 'List' war nur für das Beispiel. Ich habe es gerade geändert, um Missverständnisse zu vermeiden. – d1rk

Antwort

7

Das Problem ist, dass jedes Mal, wenn ich auf Elemente zugreifen, ORMLite eine SQL-Abfrage erstellt, um die Sammlung zu erhalten.

Also zunächst habe ich das nicht verstanden. Nach was Sie fragen, ist für ORMLite, um die Sammlung von Elementen zwischenzuspeichern, nachdem es es beim ersten Mal faul geladen hat. Das Problem dabei ist, dass ORMLite keine Ahnung hat, wie groß Ihre Sammlung von items ist. Einer der Gründe, warum faule Sammlungen verwendet werden, ist die Handhabung großer Sammlungen. Wenn ORMLite alle faulen Auflistungen im Speicher behalten hat, könnte es den Speicher füllen.

Ich werde auf der TODO-Liste etwas wie hinzufügen, die eine Mischung zwischen faul und eifrig macht. Guter Vorschlag.

+0

In der Doku heißt es 'Wenn eifrig auf 'wahr' gesetzt ist, wird die separate Abfrage sofort ausgeführt und die Aufträge werden als Liste in der Sammlung gespeichert. ' Ich suche nach einer Kombination von Lazy-Laden der Sammlung, sobald es ist Zugriff beim ersten Mal. Sobald die SQL-Abfrage für diese Sammlung erstellt wurde, speichern Sie sie als Liste in der Sammlung. So kann ich mehrere LazyForeignCollections in meiner Entity haben, aber sie verursachen keine zusätzlichen SQL-Abfragen wie EagerForeignCollections, wenn nie auf die Collection zugegriffen wird. Wie haben Sie bisher ein solches Problem überwunden? Vielleicht ein Ratschlag? – d1rk

+0

@ d1rk Auch hier ist das Problem, dass die Sammlung sehr groß sein kann, was den Speicher überfordern kann. Dies ist der Weg, den Ruhezustand und andere ORM-Bibliotheken arbeiten. Entweder du wirst eifrig oder faul. Ich habe es der TODO-Liste hinzugefügt. – Gray

+0

@Gray Großes upvote für dieses TODO - ich nahm anfänglich an, dass Lazy Sammlungen auf diese Weise arbeiteten ("faulCached") ... teilweise lag das daran, dass ich dachte, das Problem mit Eager beträfe mehr * Datenbankoperationen * als * Speicherverbrauch * (" Bei der Abfrage von A werden viele Datenbankoperationen ausgeführt "- http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/ForeignCollectionField.html#maxEagerLevel()). Irgendwelche Fortschritte bei der Funktion? Danke für ORMLite! –

Verwandte Themen