debería una conexión db ser un singleton?

¿Cuál es la mejor manera en Java para crear un singleton? Si una conexión DB es un singleton (siendo un singleton es automáticamente seguro para subprocesos)? Debido a que muchos usuarios no pueden acceder al DB teórico al mismo tiempo.

Una conexión de DB normalmente no debería ser un Singleton.

Dos razones:

  1. muchos controladores DB no son seguros para subprocesos. Usar un singleton significa que si tiene muchos hilos, todos compartirán la misma conexión. El patrón singleton no le da seguridad de hilo. Simplemente permite que muchos hilos compartan fácilmente una instancia “global”.
  2. Personalmente, creo que Singleton a menudo conduce a un mal diseño: Ver esta publicación (por otra persona) http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/

En lugar de hacer esto, considere un grupo de bases de datos. El grupo se comparte (y podría ser un singleton si lo desea). Cuando necesitas hacer trabajo en la base de datos, tu código hace esto:

getConnectioFromPool(); doWork() closeConnection() // releases back to pool 

Bibliotecas de conjuntos de muestras:

La mejor manera de crear un singleton (a partir de hoy) es el patrón enum singleton ( singleton enum de Java )

Dudo que un Singleton sea necesario o de valor para una conexión de base de datos. Probablemente desee una creación diferida: se crea una conexión a la primera demanda y se almacena en caché; se completarán más solicitudes con la instancia en caché:

 public ConnectionProvider { private Connection conn; public static Connection getConnection() { if (conn == null || conn.isClosed()) { conn = magicallyCreateNewConnection(); } return conn; } } 

(no es seguro para subprocesos: sincronice, si es necesario)

¿Cuál es la mejor manera en Java para crear un singleton?

Siga las pautas de creación de patrones de diseño. es decir, constructor privado, etc.

Si una conexión DB es un singleton (siendo un singleton es automáticamente seguro para subprocesos)?

crear una conexión de base de datos como singleton podría ser una opción de diseño deficiente en muchos escenarios. Úselo solo si está seguro de que no necesita concurrencia DB. Si tiene varios usuarios conectados al mismo tiempo, o incluso si su único usuario genera muchos hilos que necesitan acceder al DB, entonces un grupo de conexión de base de datos es una mejor opción. Puede usar agrupaciones de conexiones apache o tomcat db. Estas clases se definen, por ejemplo, en el paquete

 org.apache.commons.dbcp.*; org.apache.tomcat.dbcp.dbcp.*; 

donde dbcp significa agrupación de conexiones de base de datos.

La razón principal para usar un grupo de conexiones es que, en promedio, el tiempo que demora el acceso a la base de datos (DML, etc.) es mucho menor que el tiempo que lleva crear una conexión y luego cerrar la conexión. Además, no olvide cerrar las variables ResultSet, PreparedStatement y Connection después de que finalice la transacción.

Debido a que muchos usuarios no pueden acceder al DB teórico al mismo tiempo.

Por qué no? DB en la mayoría de los casos está destinado a ser utilizado al mismo tiempo. Tiene estos niveles de aislamiento de BD: READ_COMMITTED, READ_UNCOMMITTED, SERIALIZED, etc. SERIALIZED es el caso donde su base de datos se convierte en acceso de usuario único.

Los singletons son un patrón: no hay una forma explícita de crear uno, simplemente sigue la práctica del diseño.

Por lo tanto, si está utilizando una base de datos que puede manejar lecturas / escrituras concurrentes (es decir, MySQL), no necesita preocuparse tanto por la seguridad de los hilos. Si está utilizando un DB que no hace bien las escrituras simultáneas (SQLite), entonces un singleton debería funcionar teóricamente.