2011-10-17 18 views
6

Tengo una biblioteca Java donde accedo a la base de datos a través de JDBC utilizando el soporte JDBC de Spring. Esta biblioteca contiene aproximadamente una clase DAO para cada tabla a la que necesito acceder, que son más de cien. Actualmente instalo una nueva JdbcTemplate, o una de sus variantes, cada vez que necesito realizar una nueva consulta. ¿Esto se considera una buena práctica o debería reutilizar un solo JdbcTemplate tanto como pueda? De hecho, he visto ejemplos de ambos enfoques en libros o documentación en línea.¿Es mejor crear una nueva JdbcTemplate en cada consulta o inyectar una sola en todas partes?

El contexto es una aplicación J2EE, pero idealmente el código debería poder usarse en diferentes contextos, p. Ej. en pruebas fuera de línea o herramientas de soporte de línea de comandos.

Respuesta

4

Inyectar uno, ¿por qué molestarse en crear instancias? (No está claro si se refiere a "crear instancias a través del contexto Spring" o "crear instancias usando new".)

La mayoría de las muestras que he visto hacen esto en la configuración, ni siquiera estoy seguro de haberlas instanciado manualmente fuera del código de demostración/prueba. Veo poco beneficio por hacerlo manualmente, y cero si se hace fuera de Spring.

+0

¿es seguro para subprocesos, por lo que es un Singleton suficiente o no? – stivlo

+0

Heredé esta biblioteca y ya estaba escrita de esta manera. –

+0

como nota, probablemente sea * mala * práctica para seguir creando plantillas. – hvgotcodes

3

Aunque no hay muchos gastos generales involucrados en la creación de una nueva JdbcTemplate, no hay mucho más que un punto. La clase JdbcDaoSupport, una clase abstracta útil para manejar DAO basados ​​en JdbcTemplate, permite consistentemente que cada DAO inyecte un DataSource (y explore las versiones subyacentes de una JdbcTemplate basada en ese DataSource) o inyecte una JdbcTemplate. Ya que se puede hacer ya sea sólo sería hacer esto último si estuviera mirando a personalizar su JdbcTemplate mediante el establecimiento de una o más de las siguientes propiedades:

  • de fetchSize
  • ignoreWarnings
  • maxRows
  • nativeJdbcExtractor
  • QueryTimeout
  • skipResultsProcessing
  • exceptionTranslator

Es probable que tenga una JdbcTemplate para cada combinación de estas propiedades. Todos estos tienen valores predeterminados, por lo que solo es necesario configurarlos si los va a anular. Dependiendo de la diversidad de sus DAO, puede tener uno o muchos. O en el caso de extender JdbcDaoSupport, es posible que no tenga ninguno, ya que cada DAO solo ajusta el origen de datos en una JdbcTemplate predeterminada debajo de las cubiertas.

0

Las instancias de la clase JdbcTemplate son seguras para hilos una vez configuradas, por lo que puede configurar una única instancia de JdbcTemplate y luego inyectar de forma segura esta referencia compartida en varios DAO (o repositorios). Para obtener más información: JdbcTemplate-idioms

Cuestiones relacionadas