2011-11-16 35 views
0

我得到Java.sql.Connection关闭每当我在我的生产服务器上上载我的应用程序时出现异常。生产服务器是Jboss。 我也尝试过在QA,DEV服务器上不发生此问题。 我们是一个Web应用程序,每当我们遍历特定的选项卡时,都会发生此异常。Java.sql连接关闭特定服务器上的异常

这是跟踪:

2011-11-11 14:32:12983 ERROR [STDERR] java.sql.SQLException中:关闭连接 2011-11-11 14:32:12984 ERROR [ STDERR] at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 2011-11-11 14:32:12,984 ERROR [STDERR] at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146 ) 2011-11-11 14:32:12,984 ERROR [STDERR] at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 2011-11-11 14:32:12,984错误[STDERR] at oracle .jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java :897) 2011-11-11 14:32:12,984 ERROR [STDERR] at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:816) 2011-11-11 14:32:12,984错误[STDERR] at com.amadeus.mis.usermanagement.MisDb.prepareStatement(MisDb.java:72) 2011-11-11 14:32:12,984错误[STDERR] at com.amadeus.mis.usermanagement.MisDb.getCompId(MisDb.java :1002) 2011-11-11 14:32:12,984错误[STDERR] at com.amadeus.mis.usermanagement.MisDb.loadUnLinkedUsers(MisDb.java:1033) 2011-11-11 14:32:12,984错误[ STDERR] at org.apache.jsp.LinkUser_jsp._jspService(LinkUser_jsp.java:445) 2011-11-11 14:32:12,985 ERROR [STDERR] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java :70) 2011-11-11 14:32:12,985错误[STDERR]在javax.servlet.http.HttpServlet.service(HttpServlet.java:7 17) 2011-11-11 14:32:12,985 ERROR [STDERR] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387) 2011-11-11 14:32:12,985错误[STDERR ]在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 2011-11-11 14:32:12,985错误[STDERR]在org.apache.jasper.servlet.JspServlet.service(JspServlet。的java:266) 2011-11-11 14:32:12985 ERROR [STDERR]在javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

我还附加一个代码示例,这是发生错误的代码。

public List<String>loadLinkedUsers(String uname) 
    throws Exception 
    { 

     List<String> userList = new ArrayList<String>(); 

     String[]temp=uname.split("_"); 
     String myschema=temp[0]+"_"+temp[1]; 
     if(!getUserType(uname).equalsIgnoreCase("RC")) 
     { 
     PreparedStatement stmt = null; 

     stmt = prepareStatement("select res_user_id from"+" "+myschema+".res_user where login_id = ? and res_user_id !='Administrator'"); 
     stmt.setString(1,uname); 

     try { 

      ResultSet rs = stmt.executeQuery(); 
      while(rs.next()) 
      { 

       userList.add(rs.getString(1)); 

      } 
      rs.close(); 
     } catch (Exception e) { 
      System.out.println("Exception"+e.getMessage()); 
     } 
     stmt.close(); 
     } 
     return userList; 

    } 

    public int getCompId(String userName) 
    { 
     PreparedStatement stmt; 
     int temp=0; 
     try{ 
     stmt = prepareStatement("Select comp_id from mis.users where login_id = ?"); 
     stmt.setString(1,userName); 
     ResultSet rs=stmt.executeQuery(); 
     while(rs.next()) 
     { 
      temp=rs.getInt(1); 
     } 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return temp; 
    } 
    /** 
    * Load the information about users that are not Linked to 
    * the user who is logged in. 
    * (login_id, user_email, user_type_id from table mis.users) 
    * @param login 
    * @param users Vector that is filled with user information of type User. 
    *    The previous data is not cleared. 
    * @throws SQLException 
    */ 
    public List<String> loadUnLinkedUsers(String uname) 
    throws Exception 
    { 

     List<String>userList = new ArrayList<String>(); 

     String[]temp=uname.split("_"); 
     String myschema=temp[0]+"_"+temp[1]; 
     int comp_id=getCompId(uname); 

     if(!getUserType(uname).equalsIgnoreCase("RC")) 
     { 
     PreparedStatement stmt1=null; 
     String query1="select res_user_id from"+" "+myschema+".res_user where login_id=? and res_user_id='Administrator'"; 
     stmt1 = prepareStatement(query1); 
     stmt1.setString(1,uname); 
     try { 

      ResultSet rs1 = stmt1.executeQuery(); 
      /*if(!rs1.next()) 
      { 
       userList.add("Administrator"); 
      }*/ 

     } catch (Exception e) { 
      System.out.println("Exception"+e.getMessage()); 
     } 

     PreparedStatement stmt = null; 
     String query="SELECT u.login_id FROM mis.users u LEFT JOIN mis.user_type t ON u.user_type_id = t.user_type_id WHERE comp_id = ? minus select res_user_id from"+" "+myschema+".res_user where login_id =?"; 
     stmt = prepareStatement(query); 
     stmt.setInt(1,comp_id); 
     stmt.setString(2,uname); 

     try { 

      ResultSet rs = stmt.executeQuery(); 
      while(rs.next()) 
      { 
       userList.add(rs.getString(1)); 

      } 
      rs.close(); 
     } catch (Exception e) { 
      System.out.println("Exception"+e.getMessage()); 
     } 
     stmt.close(); 
     } 
     return userList; 

    } 

请注意,这是用于创建Prepared Statements的函数。

protected Connection m_Connection; 

    /** 
    * Prepare a statement from the current connection 
    * @param strSql 
    * @return Prepared statement 
    * @throws SQLException 
    */ 
    protected PreparedStatement prepareStatement(String strSql) throws SQLException 
    { 
     logger.debug("SQL= " + strSql); 
     return m_Connection.prepareStatement(strSql); 
    } 
+0

那么它缺少一些上下文,你的堆栈跟踪从哪里来。可能是连接超时太短。您可以延长它,或者试着修复即时关闭的连接。如果你需要帮助,那么需要更多的代码。 – Jerome

+1

它也可能是尝试使用已关闭的连接。 –

回答

1

我终于通过替换classes12.jar并使用初始上下文替代驱动程序管理器来解决了该问题。

+0

什么是classes12.jar?你还可以详细说明初始上下文吗?我正面临类似的问题。 –

1

看起来数据库在一段时间后关闭了你的连接。确保在数据源配置文件中使用有效的检查SQL来启用check-valid-connection-sql属性(例如,从双选中选择1),以便在重新调用给您之前自动验证连接。另外,还要确保你没有持有到一个类变量的连接对象,并跨多个请求

<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql> 
+0

我做了你所说的并关闭连接,管理它,使得我一次只打开一个连接。现在,我得到一个新的异常Io异常:大小数据单元(SDU)不匹配.10.2.0.1.0是Oracle我们正在使用10g版本,并且使用classes12.jar作为驱动程序 –

+0

为什么不使用ojdbc14.jar作为驱动程序? – maneesh

1

目前尚不清楚哪里是什么的m_Connection范围,无论是重用,如何往往被重用重用它或者多个线程是否可以同时访问同一个连接,这可能会导致问题。

如果m_Connection保持打开状态并意图由个别请求重复使用,可能发生的情况是数据库驱动程序可能会在一段时间不活动后自动关闭它。

我的问题是,你会考虑使用JNDI DataSource来查找你的连接,而不是缓存连接m_Connection

Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/TestDB"); 
Connection conn = ds.getConnection(); 

try { 
    ... DB logic ... 
} finally { 
    conn.close(); 
} 

这样创建和管理连接的业务委托给将池中的连接应用服务器,这样你就不会真正打开和关闭一个新的连接每次你打电话。

与代码其他可能的问题包括:

  • 不关闭所有ResultSet小号
  • 不关闭PreparedStatement S IN一个最后块(或以getCompId情况下不关闭它在所有)
+0

我做了你所说的并关闭连接,管理它,以便我一次只打开一个连接。现在,我得到一个新的异常 Io异常:大小数据单元(SDU)不匹配 –

+0

10.2.0.1.0是我们使用的Oracle 10g版本和classes12.jar作为驱动程序 –

+0

异常听起来可能是由驱动程序问题引起的。 'classes12.jar'听起来很古老(Java 1.4的驱动程序往往被称为'ojdbc14.jar',这是Java 5'ojdbc5.jar'的驱动程序,所以有迹象表明驱动程序是古老的。从http下载一个新的驱动程序://www.oracle.com/technetwork/database/features/jdbc/index-091264.html – beny23

相关问题