Java 通过连接防止Oracle数据库错误
我有些麻烦,但没必要 因为我的Java 通过连接防止Oracle数据库错误,java,oracle,jsp,oracle11g,wildfly,Java,Oracle,Jsp,Oracle11g,Wildfly,我有些麻烦,但没必要 因为我的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
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();
}
}
%>
对于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>
jdbc:oracle:thin:@myhost:1521:ODS
oracle.jdbc.OracleDriver
ojdbc6.jar
我的用户
********
真的
如何防止或跳过这些错误?
我应该先尝试刷新servlet/connect测试吗
更新:因为我无法更改Oracle的PDA您的数据库配置文件可能有问题。即使可以解决连接池设置的问题,也应该尝试在数据库端解决此问题。如果您曾经看到过这个问题,那么它很可能正在影响其他用户和其他可能没有解决方法的工具 首先,找出适用于您的用户的配置文件:
select username, profile
from dba_users
order by username;
发生这些问题的最常见方式是用户处于错误的配置文件中。确保您的应用程序帐户未卡在用户配置文件中。DBA通常至少设置两种配置文件—一种用于用户帐户,强制断开连接,另一种用于应用程序帐户,从不强制断开连接
如果用户处于正确的配置文件中,请检查配置文件值。对于资源CONNECT\u TIME
和IDLE\u TIME
,您的应用程序用户可能应该具有UNLIMITED
的值
select profile, resource_name, limit
from dba_profiles
where resource_name in ('IDLE_TIME', 'CONNECT_TIME')
order by 1,2;
如果应用程序配置文件设置为较小的值,则可能需要运行以下命令:
alter profile your_profile limit connect_time unlimited;
my.OracleConnectionPool
是您编写的类吗?我认为应该在将连接返回到客户端之前测试连接,并在必要时丢弃它们。假设OracleConnectionPool
是OracleConnectionPool.getConnection()中的自定义连接池实现
您可以通过触发select 1 form dual
检查连接是否有效,如果连接已关闭,请创建一个新连接并返回它。@tgdavies Yes is my class将返回为DataSource
连接到数据库并正常工作我正在处理wildfly
连接池中的问题,不在servlet中。连接池将连接保持打开状态很长一段时间(应该如此),因此它需要检查连接是否定期超时。感谢我看到的解决方案java:MYCON
的用户拥有60连接时间
,但不幸的是,我没有更改dba的权限。。。我可以使用“从客户端重试”吗?您应该与数据库管理员讨论此问题。他们应该想改变它,并为你提出它而高兴。(但我知道许多DBA是多么无益,所以请做好失望的准备。)因为这样可以减少数据库服务器的负载