【问题标题】:Prevent Oracle Database Error by Connection通过连接防止 Oracle 数据库错误
【发布时间】: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 是您编写的课程吗?我认为它应该在将连接返回给客户端之前对其进行测试,并在必要时丢弃它们。
  • 假设OracleConnectionPoolOracleConnectionPool.getConnection() 中的自定义连接池实现,您可以通过触发select 1 form dual 检查连接是否有效,如果连接已关闭,则创建一个新连接并返回它。
  • @tgdavies 是的,我的课程将返回 DataSource 它连接到数据库并正常工作
  • 我在wildfly工作
  • 问题出在您的连接池中,而不是在您的 servlet 中。连接池会长时间保持连接打开(应该如此),因此它需要定期检查它们是否没有超时。

标签: java oracle jsp oracle11g wildfly


【解决方案1】:

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

首先,找出适用于您的用户的个人资料:

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:MYCON的用户有60 connect_time
  • 但不幸的是我没有更改 dba 的权限...我可以从客户端重试吗
  • 您应该与数据库管理员讨论此问题。他们应该想要改变它并且很高兴你提出来。 (但我知道许多 DBA 会带来多大的帮助,所以请做好失望的准备。)
  • 因为减少了数据库服务器的负载
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2018-06-20
  • 2010-11-21
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
相关资源
最近更新 更多