2010-12-09 24 views
5

Tenemos una aplicación Java J2EE que utilizaba llamadas de servicios web individuales para cada inserción/actualización de fila de la base de datos. Eso resultó ser MUY lento. Me han traído para "arreglarlo" rápidamente. Planeo convertir todas las llamadas al servicio web a JDBC simple. Para hacer eso, necesito obtener una conexión JDBC del grupo y luego usarlo en múltiples métodos diferentes. Necesito usar la misma conexión JDBC en varios DAO para unir todo en una sola transacción de base de datos. Puedo pasar explícitamente la conexión JDBC a cada DAO que lo necesite, pero eso requeriría que cambie MUCHAS firmas de métodos, además de MUCHAS pruebas de unidades (que van en contra de la parte "rápida").Cómo pasar la conexión JDBC sin utilizar Spring/JPA/Hibernate

Estoy tratando de encontrar una buena manera de poner la conexión JDBC en algún lugar y luego simplemente agarrarla en los métodos que la necesitan sin tener que pasarla explícitamente a todas partes. No podemos usar Spring, JPA o Hibernate en este proyecto porque el equipo de soporte no admitirá esas tecnologías. Puedo poner la conexión JDBC en un EJB, pero no estoy seguro de qué tan confiable sería. Podría crear un Singleton personalizado para administrar las conexiones de la base de datos para cada usuario (¿sesión?), Pero tendría que tener cuidado con la seguridad del hilo. Si alguien ha intentado hacer algo así antes, agradecería algunos consejos.

Respuesta

1

Puede utilizar un ThreadLocal. Tiene el punto de entrada a colocarla ya que los DAOs

class ConnectionUtil { 
    public static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>(); 
} 

public Return method(Args arg) { 
    ConnectionUtil.connection.set(newConnection()); 
    try { 
     ... 
    } finally { 
     ConnectionUtil.connection.remove(); 
    } 
} 

bastante feo, pero eso parece ser lo que quiere su jefe.

+0

Esto podría funcionar muy bien para nosotros. ¿Hay algún problema importante de rendimiento al hacerlo de esta manera? – Shane

+0

ThreadLocal ha sido un objetivo de mejoras de rendimiento de Sun por un tiempo. Comparado con las operaciones de DB, será un error de redondeo. – sblundy

1

Lo hemos hecho antes (hace 5 años más o menos en IBM WebSphere). Escribimos un grupo propio y almacenamos las conexiones jdbc en una tabla hash con el ID de sesión. El único inconveniente fue cerrar la conexión en sessionend y devolverla al grupo (lo hicimos con un sessionlistener). Si una sesión de usuario se conecta solo a una conexión jdbc, la seguridad de la secuencia se hereda. Entonces el enfoque singleton definitivamente funciona. Nuestra ganancia de rendimiento fue horrible.

2

Use Apache Commons DBCP. Es el proyecto de Connection Pool de Apache, y lo que se usa internamente en muchos motores.

+1

Entiendo que Apache Commons DBCP ayuda a mantener un conjunto de conexiones, pero necesito cada método individual de inserción/actualización/eliminación de DAO para poder obtener la MISMA conexión. ¿Puede DBCP ayudar con eso? ¿Hay algún ejemplo en alguna parte? Intenté varias búsquedas en Google y no pude encontrar nada. – Shane

0

Además, lo que he hecho para los DAO en esto no es pasar la conexión en la firma del método sino en el Constructor. Luego sostengo el objeto que originalmente crea la conexión responsable de cerrarlo.

Cuestiones relacionadas