Java - Pool de conexiones Jboss 7.x y WildFly 10 con PostgreSQL 9.x ¡CONEXIONES AGOTADAS!

 
Vista:
sin imagen de perfil

Pool de conexiones Jboss 7.x y WildFly 10 con PostgreSQL 9.x ¡CONEXIONES AGOTADAS!

Publicado por m93developer (2 intervenciones) el 03/03/2017 17:56:50
Buen día

De antemano pido disculpas si paso por alto alguna regla del foro
esto se debe a que me acabo de registrar y por tanto este es mi primer hilo, dicho es procedo.

Tecnologías Probadas

Sistemas Operativos:
Windows 7 Professional 64 Bits
Windows 10 Professional 64 Bits
GNU/Linux Debian Jessie 8.7 64 Bits
IDE:
Eclipse Neon
Verciones Java:
JDK 8
JDK 7
Bases de Datos:
PostgreSQL 9.4


Como el titulo dice "Pool de conexiones Jboss 7.x y WildFly 10 con PostgreSQL 9.x ¡CONEXIONES AGOTADAS!",
esto significa que aunque he logrado realizar el pool de conexiones como lo indican en los diferentes foros e incluso en la página web oficial de Jboss/WildFly
y que a demás el test indica que el pool se conecta correctamente a la base de datos, sigo teniendo un problema

El problema es el siguiente:
Tengo una aplicación sencilla que realiza acciones como registro, consulta, actualización y borrado osea, un CRUD,
cuando mi aplicación inicia y realizo una inserción de datos, estos datos se registran correctamente en la base de datos
y los demás acciones ya antes mencionadas también se realizan correctamente, PERO, con cada llamado a la base de datos queda una conexión en estado "IDLE", estas conexiones se suman hasta que el motor de base de datos arroja una excepción que indica que ya no hay más conexiones disponibles

Según entiendo, el pool de conexiones debe abrir cierta cantidad de conexiones y reutilizarlas cuantas veces sea necesario y cerrarlas en caso de ya no ser necesarias, pero en mi caso ni las reutiliza ni las cierra, ¿qué es lo que pasa?

los pool's de conexiones que tengo son los siguientes, uno para pruebas con java 7 y otro para java 8


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<datasource jta="true" jndi-name="java:/PoolPostgreSQLDB1J8" pool-name="PoolPostgreSQLDB1J8" enabled="true">
    <connection-url>jdbc:postgresql://localhost:5432/DataBase1</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <driver>postgresql-9.4.1212.jre8.jar</driver>
    <pool>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <prefill>true</prefill>
    </pool>
    <security>
        <user-name>admin</user-name>
        <password>admin</password>
    </security>
</datasource>
<datasource jta="true" jndi-name="java:/PoolPostgreSQLDB1J7" pool-name="PoolPostgreSQLDB1J7" enabled="true">
    <connection-url>jdbc:postgresql://localhost:5432/DataBase1</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <driver>postgresql-9.4.1212.jre7.jar</driver>
    <pool>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <prefill>true</prefill>
    </pool>
    <security>
        <user-name>admin</user-name>
        <password>admin</password>
    </security>
</datasource>

Mi código java de prueba es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package ejb;
 
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.sql.DataSource;
 
import org.jboss.logging.Logger;
 
import entidades.CatValor;
import map.CatValorMapper;
import utilidadesdatos.AbstractDB;
 
/**
 * Session Bean implementation class Administracion
 */
@Stateless
@LocalBean
public class CatValorEJB extends AbstractDB implements CatValorEJBLocal {
 
	@Resource(mappedName="java:/PoolPostgreSQLDB1J8")
	private DataSource dataSource;
 
	private static Logger logger = Logger.getLogger(CatValorEJB.class);
 
	public CatValorEJB() { }
 
	@Override
	public List<CatValor> listarCatValors() {
		ResultSet resultado = null;
		PreparedStatement sentencia = null;
		List<CatValor> listaValores = new ArrayList<CatValor>();
		String consulta = "select cval_id, cval_descripcion, cval_valor, cval_parametro_cpar_id, cval_estado from cat_valor cv inner join cat_parametro on cpar_id = cval_parametro_cpar_id where 1=1 ";
		try {
			sentencia = dataSource.getConnection().prepareStatement(consulta,  ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			resultado = sentencia.executeQuery();
			listaValores = consultarObjetos(resultado, CatValorMapper.CATVALOR);
		} catch (SQLException e) {
			logger.error("Error listarValores ", e);
		} finally {
			cerrarConexiones(dataSource, sentencia, resultado);
		}
		return listaValores;
	}
}
 
public void cerrarConexiones(final DataSource datasource, final PreparedStatement sentencia, final ResultSet resultado) {
	if (null != resultado) {
		try {
			resultado.close();
		}
		catch (final SQLException e) {
			e.printStackTrace();
		}
	}
	if (null != sentencia) {
		try {
			sentencia.close();
		}
		catch (final SQLException e) {
			e.printStackTrace();
		}
	}
	if (null != datasource) {
		try {
			datasource.getConnection().close();
		}
		catch (final SQLException e) {
			e.printStackTrace();
		}
	}
}



Las mismas consultas hechas montando la aplicación en un servidor TomEE con su respectivo pool de conexiones funciona sin problemas
pero en mi caso no es una opción implementar otro servidor

ya he probado muchas configuraciones pero siempre sucede lo mismo incluso en distintos sistemas operativos e incluso con otros motores de bases de datos como MySQL

algunos sugieren configurar las propiedades "Decrementer Class" y "Decrementer Properties" pero no está muy claro como hacerlo para PostgreSQL
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Pool de conexiones Jboss 7.x y WildFly 10 con PostgreSQL 9.x ¡CONEXIONES AGOTADAS!

Publicado por m93developer (2 intervenciones) el 23/03/2017 18:59:52
Hola!! yo de nuevo por aquí

como nadie respondió, tardé pero me respondí a mi mismo

el problema no estaba en el datasources del servidor de aplicaciones, el problema estaba en el código java del EJB

el código erroneo era el siguietne:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
	public List<Area> listarAreas(Area area) {
		List<Area> listaArea = new ArrayList<Area>();
		String sql = "select area_id, area_nombre, area_estado FROM area;";
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;
		try {
			preparedStatement = dataSource.getConnection().prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			resultSet = preparedStatement.executeQuery();
			listaArea = consultarObjetos(resultSet, AreaMapper.AREA);
		} catch (SQLException e) {
			logger.error("Error listarAreas ", e);
		} finally {
			cerrarConexiones(dataSource, preparedStatement, resultSet);
		}
		return listaArea;
	}

el código correcto es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
	public List<Area> listarAreas(Area area) {
		List<Area> listaArea = new ArrayList<Area>();
		String sql = "select area_id, area_nombre, area_estado FROM area;";
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;
		Connection connection = null;
		try {
			connection = dataSource.getConnection();
			preparedStatement = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			resultSet = preparedStatement.executeQuery();
			listaArea = consultarObjetos(resultSet, AreaMapper.AREA);
		} catch (SQLException e) {
			logger.error("Error listarAreas ", e);
		} finally {
			cerrarConexiones(connection, preparedStatement, resultSet);
		}
		return listaArea;
	}

el problema era que yo hacía la consulta y cerraba la conexión directamente sobre el datasources por lo cual cada consulta habría una nueva conexión y no cerraba

lo correcto es hacer una instancia (o eso es lo que creo que se hace) de "datasources.getConnection()" en una variable "java.sql.Connection" y sobre la variable realizar la consulta y cerrar la conexión, para que esta quede libre para otras consultas y no se habran conexiones innecesariamente

un ejemplo sencillo sería:

1
2
3
4
5
6
7
8
PreparedStatement preparedStatement = null;
Connection connection = null;
connection = dataSource.getConnection();
preparedStatement = connection.prepareStatement("select 1 where 1=1", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
resultSet = preparedStatement.executeQuery();
resultSetclose();
preparedStatement.close();
connection.connection.close();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 686
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pool de conexiones Jboss 7.x y WildFly 10 con PostgreSQL 9.x ¡CONEXIONES AGOTADAS!

Publicado por xve (345 intervenciones) el 23/03/2017 21:52:09
Gracias por compartirlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar