sintaxis programas programar programacion multihilos libro ejemplos cómo codigos java multithreading jdbc pool

programas - programacion en java pdf



¿Un conjunto de conexiones beneficiaría a un programa Java multiproceso? (2)

Tengo un proceso de Java que inicia aproximadamente 60 subprocesos y cada uno accede a una base de datos MySql.

¿Me beneficiaría de usar un grupo de conexión como C3P0? ¿O solo está destinado a aplicaciones web (que se adaptan a muchos usuarios)?

Hoy tenemos conexiones JDBC de larga vida (una por hilo), y mi plan era obtener una conexión del conjunto de conexiones antes de cada consulta / inserción SQL.

Me pregunto si eso haría que nuestra aplicación sea más estable. Además, si lo configuro para que coincida con el número máximo de conexiones en la base de datos, ¿el hilo tendrá que esperar hasta que haya una conexión gratuita? La documentación no es muy clara (al menos no para mí).

Cualquier orientación es apreciada!


Probablemente pueda beneficiarse de un grupo de conexiones. La "falla del enlace de comunicaciones" junto con las conexiones JDBC de larga duración me hacen sospechar que la conexión se interrumpe después de un tiempo de inactividad (inactividad).

Un grupo de conexión de base de datos como HikariCP hace dos cosas para usted que pueden ayudar:

  • Verifique que la conexión sea válida antes de entregarla. Si no es válido, se descarta y se entrega otra o una conexión nueva válida. Todo esto lo hace el grupo, su aplicación no tiene que encargarse de esto.
  • mantener las conexiones saludables al cerrar las conexiones inactivas ("idleTimeout") y ciclar las conexiones de larga duración ("maxLifetime"). Esto último es especialmente útil cuando los componentes de red defectuosos (firewalls) eliminan cualquier conexión que esté abierta durante más tiempo que, digamos, 30 minutos. (*)

Si se utilizan todas las conexiones del grupo, un subproceso podría tener que esperar ("connectionTimeout"). Pero si su grupo tiene un tamaño máximo apropiado ("maximumPoolSize") esto rara vez será mucho tiempo. Requiere que su aplicación reduzca al mínimo el tiempo que utiliza una conexión: entre obtener una conexión y cerrarla (lo que devuelve la conexión al grupo), su aplicación debería / solo realizar acciones de la base de datos. Un efecto secundario será que necesitará muchas menos conexiones: donde usa 60 ahora, puede encontrar que solo necesita 6 en el grupo. Se necesitan algunas pruebas de rendimiento para determinar el "tamaño máximo de la piscina" adecuado para su aplicación.

Le sugiero que intente una prueba de "desconexión" con y sin un grupo de conexiones. Ejecute su aplicación y dele algo que hacer, desenchufe el cable de red, luego vuelva a enchufar el cable de red y vea cuánto tarda su aplicación en recuperarse. En el caso de la agrupación, debería ver que su aplicación funciona normalmente nuevamente tan pronto como el grupo pueda crear una nueva conexión a la base de datos.

(*) Hay otra razón para las conexiones cíclicas: algunas consultas pueden producir datos temporales en el lado del servidor de la base de datos y el servidor de la base de datos puede mantener esto mientras la conexión esté activa. Esto podría resultar en un uso de memoria cada vez mayor por parte del servidor de la base de datos. No he visto que esto suceda, pero sé que otros lo han hecho. Una opción de "maxLifetime" es muy útil en tal caso.


Dejando de lado las preguntas sobre dónde se está ejecutando su aplicación y si tiene su base de datos expuesta a Internet, no creo que agregar un grupo de conexión solucione su problema, pero podría mejorar su aplicación.

Supongo que tus errores espurios están sucediendo cuando estás usando tu conexión a la base de datos. No reconozco su error en particular, pero parece una falla de conexión de algún tipo, lo que podría suceder si tuviera vínculos poco fiables o lentos entre usted y la base de datos. El grupo no ayudaría aquí porque es un grupo de conexiones. Una vez que obtiene la conexión, no sabe si fracasará o no por las mismas razones.

Sin embargo, si usa un grupo, no tiene que mantener la conexión abierta por períodos prolongados. Con un grupo, solicita una conexión y se creará una si no hay ninguna disponible. Después de devolver la conexión, podría estar (desconectada) y eliminada si no se ha utilizado durante un tiempo. A menos que su aplicación sea constante usando todas las conexiones, esto sería bueno tanto para su aplicación como para el servidor.

Incluso aquí, tienes que hacer algo extra para manejar el error. Supongamos que ha tomado una conexión del grupo y, posteriormente, ha fallado. Puede cerrarlo y solicitar al grupo una nueva conexión (debe haber alguna API en el grupo para deshacerse de esa conexión). Una nueva conexión podría estar en mejor estado.

Finalmente, considere quizás no usar JDBC a través de Internet. Como es probable que otras personas señalen, esto se expone a riesgos innecesarios. Tal vez utilice un servicio web de algún tipo para leer y escribir datos a través de https seguros y una interfaz más restringida.