viernes, 30 de junio de 2017

Consejos: connection Pool en Java: es q vale realmente la pena el rollo?

Hoy voy a escribir un pequeno articulo sobre el "Connection Pool" - el tema q siempre veo en los forums. Normalmente el código crea una nueva conexión cada vez que ejecutamos un SQL -> no es optimal para la performance. Entonces porque no intentamos a re-utilizar una conexión, si existe ya?
El problema es q no es tan fácil y la realización depende del vendedor de la BD: Oracle tiene su manera de gestionarlo, WebSphere - la suya, Tomcat - la suya etc.

Es q vale realmente la pena el rollo?

Yo consejería 2 posibilidades. Para pequeños proyectos y para probar algo rapidito - no nos enrollamos y hacemos a la manera fácil:

- con BasicDataSource:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(URL);
ds.getConnection();

o con DriverManager:


Class.forName(DRIVER);
java.sql.Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);





Para cosas serias, donde habrá acceso mucha gente, tendremos que pensar en la velocidad o rendimiento. En 99% de casos el pool de las conexiones no es nada difícil y se hace en 2 pasos siguientes:

- Servidor: lee el manual! Debe haber una pagina de la configuración (p.e. para IBM Websphere o Glassfish) o un file xml (para Tomcat hay un file server.xml) donde configuramos el recurso JNDI DataSource y adaptamos a nuestras necesidades, nuestra BD, etc:

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" 
maxActive="100" maxIdle="30" maxWait="10000" username="root" password="" 
driverClassName="com.mysql.jdbc.Driver"               
url="jdbc:mysql://localhost:3306/cdcol"/>
- Aplicación: en web.xml hay q insertar el tag <resource-ref>  :
<resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
luego en el código Java obtenemos la conexión a traverso de "lookup":

Context ctx=new InitialContext(); 
Context envContext = (Context)ctx.lookup("java:comp/env"); 
DataSource ds=(DataSource)envContext.lookup("jdbc/TestDB");//TestDB is the Database Name 
con=ds.getConnection();

Y ahí lo tienes!
P.S En general el "context.lookup()" nos permite de obtener varias cosas, no solo la conexion BD. P.e. una cola (queue) o topic en caso de JMS para enviar los mensajes. Pero esos temas miraremos otra vez que son grandes y yo quiero ir pa casa. Buen finde!

No hay comentarios:

Publicar un comentario