Como dice todo el mundo, es necesario utilizar un pool de conexiones. ¿Por qué? ¿Que pasa? Etc.
¿Qué está mal con su solución
sé que esto ya que yo también pensé que era una buena idea en otro tiempo. El problema es doble:
- Todos los hilos (las solicitudes servlet se sirven con un hilo por cada uno) compartirán la misma conexión. Por lo tanto, las solicitudes se procesarán de a una por vez. Esto es muy lento, incluso si simplemente te sientas en un solo navegador y te apoyas en la tecla F5. Pruébalo: esto suena de alto nivel y abstracto, pero es empírico y comprobable.
- Si la conexión se interrumpe por algún motivo, no se volverá a llamar al método init (porque el servlet no se pondrá fuera de servicio). No trates de manejar este problema colocando un try-catch en doGet o doPost, porque entonces estarás en el infierno (escribiendo un servidor de aplicaciones sin que te pregunten).
- Al contrario de lo que se podría pensar, no tendrás problemas con las transacciones, ya que el inicio de la transacción se asocia con el hilo y no solo con la conexión. Podría estar equivocado, pero como esta es una mala solución de todos modos, no te preocupes.
Por qué conjunto de conexiones
piscinas de conexión le dan un montón de ventajas, pero sobre todo los que resuelven los problemas de
- Establecimiento de una conexión de base de datos real es costoso. El grupo de conexiones siempre tiene algunas conexiones adicionales y le da uno de esos.
- Si las conexiones fallan, el grupo de conexiones sabe cómo abrir una nueva
- Muy importante: cada hilo obtiene su propia conexión. Esto significa que el enhebrado se maneja donde debería estar: en el nivel DB. Los DB son muy eficientes y pueden manejar solicitudes concurrentes con facilidad.
- Otras cosas (como la centralización de localización de JDBC conectar cuerdas, etc.), pero hay millones de artículos, libros, etc. en este
Cuando para obtener una conexión
En algún lugar de la pila de llamadas iniciada en su delegado de servicio (doPost, doGet, doDisco, lo que sea) debe obtener una conexión y luego debe hacer lo correcto y devolverlo en un bloque finally. Debo mencionar que el arquitecto principal de C# dijo una vez que debería usar finally
bloques 100x más que catch
bloques. Palabras más verdaderas nunca hablan ...
Qué piscina
Estás en un servlet, por lo que debe utilizar la agrupación de conexiones del contenedor ofrece conexión. Su código JNDI será completamente normal, excepto por cómo obtiene la conexión. Hasta donde yo sé, todos los contenedores de servlets tienen grupos de conexiones.
Algunos de los comentarios sobre las respuestas anteriores sugieren el uso de una API de grupo de conexión en particular. Tu WAR debería ser portátil y "simplemente implementar". Creo que esto es básicamente incorrecto Si utiliza el grupo de conexiones proporcionado por su contenedor, su aplicación se podrá implementar en contenedores que abarcan varias máquinas y todas esas cosas elegantes que ofrece la especificación de Java EE. Sí, los descriptores de despliegue específicos del contenedor deberán escribirse, pero ese es el modo EE, mon.
Un comentarista menciona que ciertas agrupaciones de conexiones provistas por contenedor no funcionan con controladores JDBC (menciona Websphere). Eso suena totalmente descabellado y ridículo, por lo que probablemente sea cierto. Cuando suceda algo así, arroja todo lo que se supone que debes hacer en la basura y haz lo que puedas. Para eso nos pagan, a veces :)
Deberías marcar la pregunta de Jack Leow como correcta. Las cosas J2EE (o como lo llamen en 2009) usan un servidor de aplicaciones por alguna razón ... De todos modos, lo bueno es que si haces lo que estás diciendo arriba con init y destruye, creo que el servlet se acumulará secuencialmente las solicitudes DB, por lo que varios hilos irán despacio (ly). –
Cambiaré la respuesta aceptada ya que la comunidad gobierna :) Sin embargo, desearía que hubiese habido más explicación. Cuando hice esta pregunta hace meses, era novato de toda la escena de "java webapp" y su respuesta realmente no explicaba de qué estaba hablando. –
El problema es que es wiki de la comunidad, por lo que no se otorgan puntos. Voy a escribir una pequeña respuesta a continuación, también. –