Soviel ich weiß, sind beide DataSource
y JdbcTemplates
son threadsafe
also können Sie eine einzelne Instanz einer JdbcTemplate
und diese gemeinsame Referenz dann sicher in mehrere DAOs (oder Repositories) einspeisen . Auch DataSource
sollte ein Spring Singleton sein, da es den Verbindungspool verwaltet.
Die offizielle Spring-Dokumentation JdbcTemplate bewährte Verfahren erläutert die Alternativen (Auszüge aus dem Handbuch sind kursiv gedruckt, meine Anmerkungen in eckigen Klammern:
- konfigurieren Sie eine DataSource in Ihrer Spring-Konfigurationsdatei, und injizieren Sie dann diese gemeinsam genutzte DataSource-Bean in Ihre DAO-Klassen; das JdbcTemplate wird im Setter für die DataSource erstellt. (mit XML-Konfiguration) und dies führt zu mehreren JdbcTemplate-Instanzen, da im Datasource Setter eine
new JdbcTemplate(dataSource)
] - Komponenten-Scanning und Annotation-Unterstützung für Dependency Injection verwenden. In diesem Fall annotieren Sie die Klasse mit @Repository (was sie zu einem Kandidaten für das Component-Scanning macht) und annotieren die DataSource Setter-Methode mit @Autowired. (auch dieser Fall führt zu mehreren JdbcTemplate-Instanzen)
- Wenn Sie die JdbcDaoSupport-Klasse von Spring verwenden und Ihre verschiedenen JDBC-gestützten DAO-Klassen von ihr erweitern, erbt Ihre Unterklasse eine setDataSource(..)-Methode von der JdbcDaoSupport-Klasse. Sie können wählen, ob Sie von dieser Klasse erben wollen. Die Klasse JdbcDaoSupport wird nur aus Gründen der Bequemlichkeit bereitgestellt. [Da Sie für jede Klasse, die sie erweitert, eine Instanz von JdbcDaoSupport haben, gibt es auch eine Instanz von JdbcTemplate für jede Instanz der abgeleiteten Klasse (siehe Quellcode für JdbcDaoSupport )]
In einem späteren Vermerk wird jedoch von allen soeben vorgestellten Optionen abgeraten:
Einmal konfiguriert, ist eine JdbcTemplate-Instanz thread-sicher. Möglicherweise möchten Sie mehrere JdbcTemplate-Instanzen, wenn Ihre Anwendung auf mehrere Datenbanken zugreift, was mehrere DataSources und damit mehrere unterschiedlich konfigurierte JdbcTemplates erfordert.
Mit anderen Worten, alle soeben vorgestellten Optionen führen zu mehreren JdbcTemplate-Instanzen (eine pro DAO), und das, nachdem die Dokumentation sagt, dass dies bei der Arbeit mit einer einzigen Datenbank nicht notwendig ist.
Was ich tun würde, ist, direkt zu injizieren JdbcTemplate
an die verschiedenen DAOs, die sie benötigen, weiterzugeben. Meine Frage ist also, ob das in Ordnung ist. Und sind Sie auch der Meinung, dass die Spring-Referenzdokumentation widersprüchlich ist? Oder habe ich das falsch verstanden?