2011-10-17 16 views
6

Ho una libreria Java in cui accedo al DB tramite JDBC utilizzando il supporto JDBC di Spring. Questa libreria contiene approssimativamente una classe DAO per ogni tabella a cui ho bisogno di accedere, che sono oltre un centinaio. Attualmente istanzio un nuovo JdbcTemplate, o una delle sue varianti, ogni volta che ho bisogno di eseguire una nuova query. È considerata una buona pratica o dovrei riutilizzare il più possibile JdbcTemplate? In realtà ho visto esempi di entrambi gli approcci nei libri o nella documentazione online.È meglio istanziare un nuovo JdbcTemplate in ogni query o iniettare uno solo ovunque?

Il contesto è un'applicazione J2EE, ma idealmente il codice dovrebbe essere utilizzabile in diversi contesti, ad es. in test offline o strumenti di supporto della riga di comando.

risposta

4

Iniettarne uno, perché disturbare l'istanziazione? (Non è chiaro se intendi "istanziare attraverso il contesto Spring" o "istanziare utilizzando new".)

La maggior parte dei campioni che ho visto lo fanno nella configurazione, non sono nemmeno sicuro che li ho visti istanziati manualmente al di fuori del codice demo/test. Vedo poco beneficio nel farlo manualmente e zero se fatto fuori da Spring.

+0

è thread-safe, quindi è abbastanza Singleton o no? – stivlo

+0

Ho ereditato questa libreria ed era già stata scritta in questo modo. –

+0

come nota è probabilmente * cattiva * pratica per mantenere i modelli di istanziazione. – hvgotcodes

3

Sebbene non ci sia un grande sovraccarico nella creazione di un nuovo JdbcTemplate, non c'è molto di un punto. La classe JdbcDaoSupport, una classe astratta utile per gestire DAO basati su JdbcTemplate consente in modo coerente a ciascun DAO di iniettare un DataSource (e sottostanti le copertine crea un'istanza di un JdbcTemplate basato su tale DataSource) o iniettare un JdbcTemplate. Dal momento che si può fare o si dovrebbe fare solo il secondo se si stesse cercando di personalizzare il JdbcTemplate impostando una o più delle seguenti proprietà:

  • FetchSize
  • ignoreWarnings
  • maxRows
  • nativeJdbcExtractor
  • QueryTimeout
  • skipResultsProcessing
  • exceptionTranslator

Probabilmente si dispone di un JdbcTemplate per ciascuna combinazione di queste proprietà. Tutti questi hanno i valori predefiniti, quindi è necessario impostarli solo se hai intenzione di sovrascriverli. A seconda della diversità dei tuoi DAO, potresti averne uno o molti. O nel caso di estensione di JdbcDaoSupport, è possibile che non ci sia nessuno, visto che ogni DAO avvolge semplicemente l'origine dati in un JdbcTemplate predefinito sotto le copertine.

0

Le istanze della classe JdbcTemplate sono thread-safe una volta configurate, quindi è possibile configurare una singola istanza di JdbcTemplate e quindi inserire questo riferimento condiviso in più DAO (o repository). Per ulteriori informazioni: JdbcTemplate-idioms

Problemi correlati