我在Tomcat 9.0.12上创建了一个非常简单的Web服务,每次调用该服务时,我都会使用DataSource(在conf / context.xml文件中定义)创建与数据库(Oracle 12)的连接,然后再将响应返回到客户端,它将关闭与数据库的连接。
但是,如果我检查数据库上的活动会话,则表明该连接仍处于活动状态,因此我与数据库有很多“僵尸”连接。
我已经在客户端程序中使用了几乎相同的代码,在这种情况下,该程序关闭了连接。也许是Tomcat的配置错误?
我怎样才能解决这个问题?
谢谢!
conf / context.xml
<Resource maxWaitMillis="5000"
maxIdle="100"
maxActive="200"
password="PASSWORD"
username="USER"
url="jdbc:oracle:thin:@/192.168.1.248:1521/PRD"
driverClassName="oracle.jdbc.driver.OracleDriver"
type="javax.sql.DataSource"
auth="Container"
name="jdbc_Connection"/>
爪哇
public String method() {
try {
System.out.println("---------------------------------------");
System.out.println("START");
System.out.println("---------------------------------------");
DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/jdbc_Connection");
Connection DB = ds.getConnection();
String sql ="SELECT VAR FROM TABLE_NAME";
PreparedStatement stmt = null;
try {
stmt = DB.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while(rs.next()){
System.out.println("rs->"+rs.getString(1));
}
rs.close();
stmt.close();
} catch (SQLException ex) {
}finally{
if(stmt != null){
try {
stmt.close();
} catch (SQLException ex) {
}
}
}
System.out.println("CLOSE");
DB.close();
} catch (SQLException ex) {
ex.printStackTrace();
} catch (NamingException ex) {
ex.printStackTrace();
}
System.out.println("---------------------------------------");
System.out.println("END");
System.out.println("---------------------------------------");
return "HELLO";
}
最佳答案
他们不是僵尸。他们在连接池中等待重用。创建连接非常昂贵,因此您不想(真正)完全关闭它们。正如Andreas指出的那样,连接池返回一个包装的连接,在其中调用close()
并不会真正关闭它。它刚回到游泳池。
您的配置说,池中最多可以有100个空闲连接,而总共有200个连接。正如Mark所说,这可能是way too much。
关于java - Oracle与Tomcat 9的僵尸连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58588106/