2010-03-01 14 views
12

Quiero usar conexiones agrupadas con Java (porque es costoso crear una conexión por subproceso) así que estoy usando el objeto MysqlConnectionPoolDataSource(). Persisto mi fuente de datos en los hilos. Por lo tanto, sólo estoy usando una fuente de datos en toda la aplicación como esta:¿Estoy utilizando Java PooledConnections correctamente?

startRegistry(); // creates an RMI registry for MySQL 
    MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
    dataSource.setUser("username"); 
    dataSource.setPassword("password"); 
    dataSource.setServerName("serverIP"); 
    dataSource.setPort(3306); 
    dataSource.setDatabaseName("dbname"); 

    InitialContext context = createContext(); // Creates a context 
    context.rebind("MySQLDS", dataSource); 

Ahora que he creado mi fuente de datos, que estoy haciendo lo siguiente en cada hilo separado:

PooledConnection connect = dataSource.getPooledConnection(); 
    Connection sqlConnection = connect.getConnection(); 

    Statement state = sqlConnection.createStatement(); 

    ResultSet result = state.executeQuery("select * from someTable"); 
    // Continue processing results 

supongo lo que me confunde es la llamada al dataSource.getPooledConnection();
¿Esto realmente está buscando una conexión agrupada? ¿Y este hilo es seguro? Me di cuenta de que PooledConnection tiene métodos como notify() y wait() ... lo que significa que no creo que esté haciendo lo que creo que está haciendo ...

Además, ¿cuándo y cómo debo liberar el ¿conexión?

Me pregunto si sería más beneficioso rodar el mío porque entonces estaría más familiarizado con todo, pero realmente no quiero reinventar la rueda en este caso :).

Gracias SO

+0

Todas las clases de Java han notificado y esperan, ya que se heredan de java.lang.Object. Sin embargo, es muy raro usarlos realmente. –

+0

Sí, soy un poco nuevo en Java java ... lo estoy dando un giro – Polaris878

+0

Aquí hay un ejemplo de Apache DBCP: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/ doc/PoolingDataSourceExample.java?view = co –

Respuesta

15

Esta no es la manera correcta. La fuente de datos debe ser administrada por cualquier contenedor en el que se ejecute la aplicación. El MysqlConnectionPoolDataSource es no un grupo de conexiones. Es solo una implementación concreta de la interfaz javax.sql.DataSource. Normalmente lo defines en el contexto JNDI y lo obtienes desde allí. También MySQL lo declara todo explícitamente en their documentation.

Ahora, cómo usarlo depende del propósito de la aplicación. Si se trata de una aplicación web, debe consultar la documentación de los recursos JNDI del servletcontainer/appserver en cuestión. Si es por ejemplo Tomcat, puede encontrarlo here. Si está ejecutando una aplicación cliente, por la cual cuestionaría mucho el valor de un grupo de conexiones, entonces debe buscar un marco de agrupación de conexiones que pueda hacer uso del origen de datos agrupado de conexión proporcionado por MySQL, como C3P0.

El otro problema con el código que usted envió es que el PooledConnection#getConnection() devolverá el conexión subyacente, que es por lo tanto no una conexión agrupada. Llamar de cerca no devolverá la conexión a la agrupación, sino que realmente la cerrará. El grupo tiene que crear una nueva conexión cada vez.

Luego, la historia de la seguridad de los hilos, que depende del verdadero marco de agrupación de conexiones en cuestión. C3P0 ha demostrado su solidez en años, que no se preocupe de ello, siempre y cuando se escribe código JDBC según el lenguaje estándar, es decir, utilizar sólo las interfaces JDBC y adquirir y cerca de todos los recursos (Connection, Statement y ResultSet) en el alcance más corto posible.

+0

Es una aplicación independiente RESTlet ... por lo que no hay servidor de aplicaciones o JNDI – Polaris878

+0

Luego use C3P0. – BalusC

+0

C3P0 es bastante grande para algo que puede caber en un archivo de clase si usa PooledConnection para la tarea. – Trejkaz

Cuestiones relacionadas