【发布时间】:2020-01-07 22:18:18
【问题描述】:
我有一些麻烦但没必要。
因为我的JSP/Servlet 工作正常,但有时我有这些连接错误像这样
连接错误记录:
ORA-02396: exceeded maximum idle time, please connect again ORA-01012: not logged on ORA-00604: error occurred at recursive SQL level 1 ORA-02399: exceed maximum connect time, you are being logged off
.jsp
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="my.OracleConnectionPool" %>
<%@ page pageEncoding="UTF-8"%>
<%
Connection connect = null;
Statement s = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
connect = OracleConnectionPool.getConnection();
s = connect.createStatement();
String sql = "SELECT * FROM table";
ResultSet rec = s.executeQuery(sql);
//Do something
} catch (Exception e) {
out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
s.close();
connect.close();
} catch (SQLException ex) {
out.println(e.getMessage());
e.printStackTrace();
}
}
%>
my.OracleConnectionPool 这将从wildfly获得连接
package my;
import javax.naming.NamingException;
import java.sql.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class OracleConnectionPool {
public OracleConnectionPool() {
}
public static Connection getConnection()
throws SQLException {
try {
Context ctx = new InitialContext();
DataSource ods = null;
ods = (DataSource)ctx.lookup("java:/MYCON");
if (ods == null) {
throw new SQLException("OracleDataSource is null.");
}
return ods.getConnection();
} catch (NamingException ex) {
return null;
}
}
}
对于 Standalone.xml
<datasource enabled="true" pool-name="MYCON" jndi-name="java:/MYCON" use-ccm="false" jta="true">
<connection-url>jdbc:oracle:thin:@myhost:1521:ODS</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<driver>ojdbc6.jar</driver>
<security>
<user-name>myuser</user-name>
<password>********</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<background-validation>true</background-validation>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
</datasource>
如何防止或跳过这些错误? 我应该先尝试刷新 servlet/connect 测试吗?
更新:因为我无法更改 Oracle 的 PDA
【问题讨论】:
-
my.OracleConnectionPool是您编写的课程吗?我认为它应该在将连接返回给客户端之前对其进行测试,并在必要时丢弃它们。 -
假设
OracleConnectionPool是OracleConnectionPool.getConnection()中的自定义连接池实现,您可以通过触发select 1 form dual检查连接是否有效,如果连接已关闭,则创建一个新连接并返回它。 -
@tgdavies 是的,我的课程将返回
DataSource它连接到数据库并正常工作 -
我在
wildfly工作 -
问题出在您的连接池中,而不是在您的 servlet 中。连接池会长时间保持连接打开(应该如此),因此它需要定期检查它们是否没有超时。
标签: java oracle jsp oracle11g wildfly