java - oracle tomcat-jdbc 池连接总是使用相同的 session

标签 java oracle tomcat jdbc pool

我有一个 spring boot tomcat-jdbc 配置:

        DataSource ds = new DataSource();

    ds.setDriverClassName("oracle.jdbc.OracleDriver");
    ds.setUrl("jdbc:oracle:thin:@10.101.7.16:1521:SIAMA");
    ds.setUsername("xxx");
    ds.setPassword("ccc");
    ds.setInitialSize(10);
    ds.setMaxActive(15);
    ds.setMaxIdle(10);
    ds.setMinIdle(5);

当我启动 tomcat 时,我在我的数据库 session 中看到 10 个初始非 Activity session 。 问题是当用户启动应用程序时,总是使用数据库中的相同连接。其他 9 个从未使用过。

这是我的代码:

package com.csi_ti.itaca.custom.general.server.service;

import org.apache.tomcat.jdbc.pool.DataSource;



public class GeneralBusinessServiceImpl implements GeneralBusinessService {

public Connection conn;
ConversionUtil convert = new ConversionUtil();

@Autowired
@Qualifier("plsqlDataSource")
private DataSource plsqlDataSource;

@PostConstruct
public void init() throws SQLException {
    System.out.println(">>>>> GeneralBusinessService Con 1");
    conn = plsqlDataSource.getConnection();
}

public Connection obtenerConexion() {
    System.out.println("Obtener conexion......................");
    try {
        if ( conn.isClosed()) {
            System.out.println(">>>>>>>>>>> Conexión cerrada");

            return conn = plsqlDataSource.getConnection();
        }
        else {
            System.out.println(">>>>>>>>>>> Conexión ABIERTA");
            conn.close();
            conn = null;
            System.out.println(">>>>>>>>>>> La cerramos");
            conn = plsqlDataSource.getConnection();
            System.out.println(">>>>>>>>>>> La volvemos a abrir " + conn.toString());
            return conn;



        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return conn;
}

public void ejecutarConsulta() {
    //System.out.println("Entramos a ejecutar consulta <<<<<<<<<<<<<<<<<<<*<*<*<*<*<*<*<*<*<*>*>*<*<" );
    //System.out.println("Antes de Pob ****: " + conn);
    System.out.println(">>>>> GeneralBusinessService Con 2");
    PAC_SHWEB_PROVEEDORES llamada = new PAC_SHWEB_PROVEEDORES(conn);
    try {
        llamada.ejecutaPAC_SHWEB_PROVEEDORES__F_LISTA_TELEFONOS_EXPEDIENTE(new BigDecimal("906000060"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //System.out.println("Pob ****: " + llamada.toString());

}

private Generico0DTO getDTO(Object obj){

    System.out.println(">>>>> GeneralBusinessService Con 3");
    Generico0DTO dto = new Generico0DTO();
    List<Generico0.MapObject> listMapObjects= new ArrayList<Generico0.MapObject>();

    if (obj!=null){

        if (obj instanceof List<?>){
            for (Map m :(List<Map>)obj){
                Generico0.MapObject mapObject = new Generico0.MapObject();
                mapObject.setMap(m);
                listMapObjects.add(mapObject);
            }
        }else if (obj instanceof Map){

            Generico0.MapObject mapObject = new Generico0.MapObject();
            mapObject.setMap((Map)obj);
            listMapObjects.add(mapObject);

        }else if (obj instanceof BigDecimal){

            Generico0.MapObject mapObject = new Generico0.MapObject();
            Map map = new HashMap<String,BigDecimal>();
            map.put("RETURN",obj);
            mapObject.setMap(map);
            listMapObjects.add(mapObject);
        }           
    }
    dto.setMapObject(listMapObjects);
    return dto;
}

@Override
public Generico0 ejecutaPAC(String pac, String function, boolean tratarMensajes, Object... parameters) {
    System.out.println(">>>>> GeneralBusinessService Con 4");
    Map map;
    try {


        Class<?> clazz = Class.forName("com.csi_ti.itaca.custom.general.server.jdbc." + pac);
        Constructor<?> constructor =  clazz.getConstructor(Connection.class);
        Object pacInstance = constructor.newInstance(conn);

        String methodName = "ejecuta"+pac+"__"+function;

        ////System.out.println("LLamada pac: "+methodName);


        Class<?>[] parameterTypes = new Class<?>[parameters.length];
        Object[] parameterInput = new Object [parameters.length];

        for (int i = 0; i < parameters.length; i++) {
            if (parameters[i].getClass().equals(Integer.class)) {
                parameterTypes[i] = BigDecimal.class;
                parameterInput[i] = new BigDecimal((Integer) parameters[i]);
            } else {
                parameterTypes[i] = parameters[i].getClass();
                parameterInput[i] = parameters[i];
            }
        }

        Method method = clazz.getDeclaredMethod(methodName, parameterTypes);

        map = (Map) method.invoke(pacInstance, parameterInput);

        if(tratarMensajes){
            Object obj = Util.tratarRETURNyMENSAJES(map);
            return getDTO(obj);
        } else {
            return getDTO(map);
        }


    } catch (Exception e) {
        //System.out.println("Error_Service:"+e);

        return null;
    }
}

}

我需要池来平衡每个请求的 session 。 有什么帮助吗?

谢谢。

最佳答案

您的@PostConstruct 方法是错误的。不要使用在 post 构造中初始化的 Connection conn 变量,而是在需要时从数据源获取连接。

try(Connection con = plsqlDataSource.getConnection()) {
    // Do something with con
}

比你写的简单多了!

您的 obtenerConexion() 也是不必要的。您正在使用连接池,而不是编写连接池。

您也不应直接使用 org.apache.tomcat.jdbc.pool.DataSource,而应使用 javax.sql.DataSource

关于java - oracle tomcat-jdbc 池连接总是使用相同的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44260950/

相关文章:

Oracle SQL求和dsinterval

java - 登录/注销后防止 Spring Security 302 重定向

tomcat - tomcat 中的域名(web.xml)

java - 部署在 Tomcat 上的 Jersey 应用程序返回 404

java - 添加数组时准备语句错误

java - 包括给定包外部的类的反射(Dropwizard + Swagger)

python - 合并两个表

java - Oracle TO_DATE 函数在 Mysql 中并行,它应该同时支持 DB oracle 和 mysql

java - Spring-Boot:并发处理多个请求

java - Centos 7 如何获取 java 的替代列表