Java oracle tomcat jdbc池连接始终使用相同的会话
我有一个spring boot tomcat jdbc配置,具有:Java oracle tomcat jdbc池连接始终使用相同的会话,java,oracle,tomcat,jdbc,pool,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"); d
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时,我在数据库会话中看到10个初始非活动会话。
问题是,当用户启动应用程序时,数据库中的用户总是使用相同的连接。其他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;
}
}
}
package com.csi_ti.itaca.custom.general.server.service;
导入org.apache.tomcat.jdbc.pool.DataSource;
公共类GeneralBusinessServiceImpl实现GeneralBusinessService{
公共连接;
ConversionUtil convert=新的ConversionUtil();
@自动连线
@限定符(“plsqlDataSource”)
私有数据源plsqlDataSource;
@施工后
public void init()引发SQLException{
System.out.println(“>>>>通用业务服务Con 1”);
conn=plsqlDataSource.getConnection();
}
公共连接obtenerConexion(){
系统输出打印项次(“收货方确认”);
试一试{
如果(连接已关闭()){
System.out.println(“>>>>>>>科内西翁塞拉达”);
return conn=plsqlDataSource.getConnection();
}
否则{
System.out.println(“>>>>>Conexión ABIERTA”);
康涅狄格州关闭();
conn=null;
System.out.println(“>>>>>>>>>>>拉塞拉莫斯”);
conn=plsqlDataSource.getConnection();
System.out.println(“>>>>>>>>La volvemos a abrir”+连接到字符串());
返回连接;
}
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回连接;
}
公共无效ejecutarConsulta(){
//System.out.println(“Entramos a ejecutar consulta您的@PostConstruct
方法是错误的。与其在post构造中初始化连接conn
变量,不如在需要时从数据源获取连接
try(Connection con = plsqlDataSource.getConnection()) {
// Do something with con
}
这比你写的要简单得多
您的obtenerConexion()
也没有必要。您使用的是连接池,而不是编写连接池
您也不应该直接使用org.apache.tomcat.jdbc.pool.DataSource
,而应该使用javax.sql.DataSource
您的@PostConstruct
方法是错误的。与其在post构造中使用初始化的Connection conn
变量,不如随时从数据源获取连接你需要用一个
try(Connection con = plsqlDataSource.getConnection()) {
// Do something with con
}
这比你写的要简单得多
您的obtenerConexion()
也没有必要。您使用的是连接池,而不是编写连接池
您也不应该直接使用org.apache.tomcat.jdbc.pool.DataSource
,而应该使用javax.sql.DataSource
如果您只有一个用户,那么为什么要使用其他的呢?您到底为什么要在init()中从数据源中断开连接
?整个代码都很糟糕。许多用户连接到应用程序,但对数据库的请求总是由同一个数据库用户执行。正确吗?不,一点也不正确。您没有正确使用数据源。请举一个例子。如果您只有一个用户,为什么要使用其他用户?您到底为什么要选择其他用户在您的init()
中连接出数据源?整个代码非常糟糕。许多用户连接到应用程序,但对数据库的请求总是由同一个数据库用户执行。正确吗?不,一点也不正确。您没有正确使用数据源。请举个例子?