2010-10-14 2 views
8

Betrachten Sie die Struktur folgenden Klassen:Ist es in Ordnung, Singleton DAO-Objekte zu haben?

  1. BaseDAO mit Methoden PreparedStatement Kamm und bekommen Verbindung vom Pool
  2. AccountDAO extends BaseDAO mit Account Tabelle über JDBC zu arbeiten. Diese Klasse ist Singleton
  3. AccountService Hexe ruft Methoden von AccountDAO wie folgt aus: AccountDAO.getInstance().login(name, password).

AccountDAO ist ein Spring-Bean mit @Transactional Anmerkungen zu Methoden, die einige Daten einfügen.

Ist das OK? Ich denke Singleton DAO-Klassen können zu Leistungsproblemen führen. Könnte es besser sein, einige Frühlingsspritzen in Service-Schicht-Klassen zu verwenden? (Ich bin neu in Spring, so wird jeder Rat geschätzt)

Antwort

15

Die empfohlene Vorgehensweise in der Spring-Dokumentation ist Ihre DAOs als normale Klassen schreiben und den Singleton-Bereich verwenden. Dies funktioniert gut, wenn Ihre DAOs keinen Status beibehalten.

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes-prototype

Abschnitt 3.4.2.

Wenn Sie Spring verwenden, sollten Sie nicht mit vorbereiteten Anweisungen und was nicht tun müssen, es sei denn, Sie tun etwas wackelig. Sehen Sie sich JdbcTemplate oder HibnerateTemplate an. Ja, Sie sollten Spring verbinden, um Ihre DAOs in Ihre Dienste zu integrieren oder wo immer Sie sie brauchen.

0

Ich bin nicht vertraut mit Spring, aber im Allgemeinen möchten Sie nicht die Verbindungen zu Ihren Datenquellen von mehreren Threads zugegriffen werden. Es ist wahrscheinlich O.K. Wenn Sie es so konfigurieren, dass die DAO-Objekte Pseudo-Singletons in einem Threadkontext sind, aber nicht über Threads gemeinsam genutzt werden. Bei den meisten IoC-Containern können Sie dies über die Konfiguration vornehmen.

Natürlich bringt dies andere Überlegungen zur Datenkonsistenz ins Spiel und Sie müssen diese sorgfältig verwalten. In der Regel wird Ihnen der ORM-Teil dabei helfen.