2010-10-14 39 views
8

Tenir compte la structure des classes suivantes:Est-il correct d'avoir des objets DAO singleton?

  1. BaseDAO avec des méthodes de crête PreparedStatement et obtenir la connexion de la piscine
  2. AccountDAO extends BaseDAO travailler avec Account table via JDBC. Cette classe est appelle singleton sorcière
  3. AccountService méthodes de AccountDAO comme ceci: AccountDAO.getInstance().login(name, password).

AccountDAO est un grain de printemps avec @Transactional annotations aux méthodes qui insèrent des données.

Est-ce que c'est OK? Je pense que les classes DAO singleton peuvent causer des problèmes de performance. Peut-être est-il préférable d'utiliser quelques injections de printemps dans les classes de couche de service? (Je suis nouveau à Spring, donc tous les conseils seront appriciated)

Répondre

15

L'approche recommandée dans la documentation Spring est d'écrire vos DAO comme des classes normales et utiliser la portée singleton. Cela fonctionnera correctement si vos DAO ne conservent aucun état.

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

section 3.4.2.

Si vous utilisez Spring, vous ne devriez pas avoir besoin de traiter des instructions préparées et autres, à moins que vous ne fassiez quelque chose de bancal. Regardez JdbcTemplate ou HibnerateTemplate. Oui, vous devriez câbler Spring pour injecter vos DAO dans vos services ou là où vous avez besoin de les utiliser.

0

Je ne connais pas très bien Spring mais, en général, vous ne voulez pas que les connexions à vos sources de données soient accessibles à partir de plusieurs threads. C'est probablement O.K. si vous le configurez de sorte que les objets DAO soient des pseudo-singletons dans un contexte de thread mais ne soient pas partagés entre les threads. La plupart des conteneurs IoC vous permettront de le faire via la configuration.

Bien sûr, cela met en jeu d'autres considérations sur la cohérence des données et vous devez les gérer avec soin. Généralement, la partie ORM vous aidera avec cela.