Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过连接防止Oracle数据库错误_Java_Oracle_Jsp_Oracle11g_Wildfly - Fatal编程技术网

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是多么无益,所以请做好失望的准备。)因为这样可以减少数据库服务器的负载