Ich habe eine Jersey-Ressource, die auf die Datenbank zugreift. Grundsätzlich öffnet es eine Datenbankverbindung bei der Initialisierung der Ressource. Führt Abfragen für die Methoden der Ressource aus.
Ich habe festgestellt, dass die Datenbank bei jeder Anfrage geöffnet ist, wenn ich @Singleton nicht verwende. Und wir wissen, dass das Öffnen einer Verbindung sehr teuer ist, oder?
Also meine Frage ist, sollte ich angeben, dass die Ressource Singleton oder ist es wirklich besser, um es pro Anfrage zu halten, besonders wenn die Ressource eine Verbindung mit der Datenbank herstellt?
Mein Ressourcencode sieht so aus:
%Vor%Und ich verbinde mich mit der Datenbank mit einem ähnlichen Code:
%Vor%Einige Kommentare zu Best Practices für den Code sind ebenfalls hilfreich.
Anstatt darüber nachzudenken, die Ressource zu einem Singleton zu machen, sollten Sie sich mehr auf die Verwaltung von Backend-, Servicetyp-Objekten wie Ihre ResponseGenerator
-Klasse als Singletons konzentrieren, die offensichtlich nicht bei jeder Anfrage instanziiert werden sollten.
Wenn Sie die Ressource auch als Singleton verwenden, können Sie ResponseGenerator
als Singleton verwalten. Dies ist jedoch nicht die einzige oder die beste Methode, siehe Zugreifen auf externe Objekte in Jersey Ressourcenklasse und Wie verbinde ich einen Mitarbeiter mit einer Jersey-Ressource? , um dies in Nicht-Singleton-Ressourcen zu injizieren.
Beachten Sie, dass Ihre Klasse ResponseGenerator
funktionieren müsste, bevor sie als Singleton funktionieren würde, unabhängig davon, ob sie in eine Ressource pro Anfrage eingefügt oder in einer Singleton-Ressource instanziiert wird. Es ist nicht threadsicher, und Sie würden eine einzelne Verbindung beim Start öffnen und sie über Anfragen hinweg wiederverwenden, was nicht funktioniert. Sie sollten einen Verbindungspool verwenden, um effizient + sicher Verbindungen über Anfragen hinweg wiederzuverwenden.
Einige Kommentare zu Best Practices für den Code sind ebenfalls hilfreich.
Auf Ссылка erhalten Sie bessere Antworten. aber:
ResponseGenerator
ist ein schlechter Name für eine Klasse (fast alles in einer Webanwendung ist ein Antwortgenerator).
Verwenden Sie String nicht als Rückgabetyp Ihres Dienstes und Objekts, verwenden Sie geeignete typisierte Objekte (z. B. klingt es so, als würden Sie java.util.List
von etwas zurückgeben).
Schlucken Sie Ihre SQLException nicht, und lassen Sie sie platzen, damit Jersey in Ihrer Ressource einen Antwortcode der 5xx-Serie generieren kann.
Verwenden Sie die letzten Elementvariablen.
Ihr Log-Objekt sollte statisch sein.
Ihre beste Option ist es, ein Framework wie Spring with Jersey zu verwenden, das ich in einem ähnlichen posten . Der einzige Unterschied besteht darin, dass Sie anstelle einer Servicebohne eine gepoolte DataSource einfügen würden, die einfach mit c3p0 . Beispiel applicationContext.xml, beachten Sie, dass "scope" auf prototype gesetzt ist, was einem Singleton im Spring-Sprachgebrauch entspricht. In Ihrer MyResource.java würden Sie einfach Folgendes hinzufügen und Spring würde es entsprechend injizieren. Dann könnten Sie Ihren ResponseGenerator so ändern, dass er die DataSource akzeptiert und damit die Datenbank abfragt.
Tags und Links java database jersey web-services