Caching ResultSet
Eher wie die subjektive Frage, Die wichtigste Ziel der Frage ist, den Cache von java.sql.ResultSet. Aber ich weiß, es ist nicht die bevorzugte Mechanismus, wie es ist eng gekoppelt mit der Verbindung, und die Daten möglicherweise geleert, wenn die Verbindung geschlossen wird. Um dieses Problem zu beheben, ich bin mit CachedRowSet. Die Instanz von CachedRowSet gecached werden, mithilfe von Drittanbieter-caching-tool, das mir helfen wird, zu reduzieren, db-Aufrufe.
Code-snippet von meiner Implementierung wird unten gegeben. Die Methode executeQuery(String)
umgesetzt wird in eine abstrakte Klasse, die alle sub-Klassen zum ausführen der Abfrage. Es könnte sein, Kunden Unterklassen, wie gut Sie diese Methode zum abrufen von Daten aus unserem system.
public final ResultSet executeQuery(String query){
try {
//return data if it is available in cache, else execute and store in cache
CachedRowSet cachedRowSet=getDataFromCache(query);
if(cachedRowSet!=null) {
return cachedRowSet;
}
PreparedStatement statement=getStatment();
ResultSet rs= statement.executeQuery(query);
CachedRowSet cachedRowSet=new CachedRowSetImpl();
cachedRowSet.populate(rs);
cachedData(cachedRowSet);
return cachedRowSet;
} catch (Exception e) {
return null;
}
}
Nun, ich bin etwas verwirrt mit unten Punkte
-
Statt der ResultSet-Schnittstelle, ich werde zurückkehren Instanz CachedResultSet. Wäre das korrekt, Ersatz für resultSet. Treiber-JAR -, DB-Klassen kann über unterschiedliche Kunden-Umgebung. Kunden schreiben würde, benutzerdefinierte Klassen und in Erwartung einer Ergebnismenge, die von der Abstrakten Klasse. Wäre das keine Problem verursachen? Einige Sache wie unten
public class CustomerXX extends BaseClass {
public void process(String query){ ResultSet rs = executeQuery(query); //process rs to fetch data }
}
-
Risiko für diese Art von Betrieb( Caching
CachedRowSet
-, Daten-Korrektheit) -
Leistung zu erstellen
CachedRowSet
-
Kompatibilität mit allen
ResultSet
Operationen (ResultSet.getString()
, ResultSet.get..()). Wenn alle Fahrer erwartet/produziert verschiedene Unterklasse vonResultSet
( SagenjdbcResultSet
,BaseResultSet
etc)
Habe ich in ähnlicher Art auch von vielen anderen Frage, ist meine Meinung, ich bin nur zu schreiben, paar von Ihnen, ich fühle mich gültig und hat höhere Priorität.
Nicht sicher, ob meine Frage so vage ist, hat genug Klarheit der meine Anforderungen.
Alle Ideen, Gedanken, Vorschläge sind sehr willkommen, und vielen Dank im Voraus
- Wenn der Kunde erwartet, dass
ResultSet
, undCachedRowSet
erweitert/implementiertResultSet
, die Kunden gerne annehmenCachedRowSet
Du musst angemeldet sein, um einen Kommentar abzugeben.
Implementierung von benutzerdefinierten
CachedRowSet
könnte das schmerzhaft werden, da Sie zu implementieren alle Methoden, dieResultSet
- Schnittstelle.Ich würde empfehlen, nicht-cache auf jdbc-Ebene, sondern cache einige Wert-Objekte über data access layer statt.
Wenn du zum Beispiel user Tabelle mit id, name und E-Mail-Spalten können Sie folgende Wert-Objekt
nächsten können Sie sich vorstellen, data access layer
mit Standard-JdbcUserRepository die lädt die Daten aus der Datenbank.
Caching implementiert werden konnte, mit proxy-Muster:
Umsetzung der cache ist der schwierigste Teil. Sie haben Grund zur Sorge:
Ich würde empfehlen, um einige vorhandene caching-Lösung anstatt der Kodierung Ihrer eigenen Lösung.
Ich fand google guava stabil und einfach zu bedienen.