java - 通过连接防止 Oracle 数据库错误

标签 java oracle jsp oracle11g wildfly

我遇到了一些麻烦,但没有必要。

因为我的JSP/Servlet工作正常,但有时我有这些连接错误像这样

Connection Error Records:

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/连接测试吗?

更新:因为我无法更改 Oracle 的 PDA

最佳答案

您的数据库配置文件可能有问题。即使您可以通过连接池设置解决问题,您仍然应该尝试在数据库端修复此问题。如果您一次看到此问题,很可能它会影响其他用户和其他可能没有解决方法的工具。

首先,找出哪个配置文件适用于您的用户:

select username, profile
from dba_users
order by username;

发生这些问题的最常见原因是用户使用了错误的配置文件。确保您的应用程序帐户没有停留在用户配置文件中。 DBA 通常至少设置两种配置文件 - 一种用于用户帐户,强制断开连接,另一种用于应用程序帐户,从不强制断开连接。

如果用户处于正确的配置文件中,请检查配置文件值。您的应用程序用户的资源 CONNECT_TIMEIDLE_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;

关于java - 通过连接防止 Oracle 数据库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57798253/

相关文章:

Java - JDBC executeUpdate() 不工作

C 程序退出并出现错误 ORA-12162 : TNS:net service name is incorrectly specified

java - 将 StringArray 的值从 java 类打印到 JSP 中

java - 如何使用dojo 1.9显示地理 map

java - 在 Java 中将 Enum 转为类

java - 将通用代码打包到微服务应用程序中

java - 如何将 JSP 标签转换为 SQL

java - spring jsp <%%> 在页面上可见

java 深入列出目录并进行操作

java - Android - 使用另一个类的方法不起作用