Glassfish RAR5035:从池中销毁资源时出现意外异常

Posted

技术标签:

【中文标题】Glassfish RAR5035:从池中销毁资源时出现意外异常【英文标题】:Glassfish RAR5035:Unexpected Exception While Destroying Resource From Pool 【发布时间】:2016-05-27 12:23:46 【问题描述】:

我有一个 Java EE Web 应用程序。我正在使用 JDBC 连接数据库,并且正在使用 JDBC 连接池。我的应用程序的主页是登录页面。在我进入登录页面并等待一段时间后,我一直收到这个 glassfish server(4.1.0) 警告。

警告:RAR5035:破坏资源时出现意外异常 池 OraclePool。异常消息:销毁资源时出错 :IO 错误:套接字读取超时

即使我没有在页面上执行任何操作。当我监控连接池的统计数据时,NumConnCreated 不断增加。我该如何解决这个问题?谢谢。

这是我的托管 bean 类。

@ManagedBean
@SessionScoped
public class Login implements Serializable

    private String userName;
    private String password;
    private User user;
    private @EJB DBRemote db;

public void test()
        String[] params1 = "user","1234";
        int[] getParams = Types.INTEGER,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR;
        CallableStatement statement = db.run("TBL.USERLOGIN(?,?,?,?,?,?)", params1 , getParams);

        try 
           int isLogin = statement.getInt(3);
           if (isLogin==1) 
               String uName = statement.getString(4);
               String uId = statement.getString(5);
               user = new User(uId, uName, isLogin);
               System.out.println("LOGGED IN " + uName + "\t" + uId);
           else
               String errMessage = statement.getString(6);
               user = new User(errMessage,isLogin);
               System.out.println("LOG IN FAILURE " + errMessage);
           

         catch (SQLException ex) 
            Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
        finally
            db.close();
            FacesContext.getCurrentInstance().addMessage("infoback", new FacesMessage(FacesMessage.SEVERITY_INFO,
                "TEST","Test Works"));
        
    


这是我的接口类

@Remote
public interface DBRemote 
    CallableStatement run(String query, String[] setParams, int[] getParams);
    void close();
    String getErrorMessage();
    String getSql();

这是我的无状态 Bean 类

@Stateless
public class DB implements DBRemote

    @Resource(mappedName = "pwresource")
    private DataSource ds;

    private String sql;
    private String errorMessage;
    private CallableStatement statement;
    private Connection connection;

    public DB() 
    

    @Override
    public CallableStatement run(String query, String[] setParams, int[] getParams)
        sql = "call " + query + "";
        int getParamIndex = setParams.length + 1;
        try 
            connection = ds.getConnection();
            statement = connection.prepareCall(sql);
            for (int i = 0; i < setParams.length; i++) 
                statement.setString(i+1, setParams[i]);
            
            for (int getParam : getParams) 
                statement.registerOutParameter(getParamIndex, getParam);
                getParamIndex++;
            
           statement.execute();

        catch (SQLException ex) 
            if (ex.getErrorCode()==17008) 
                errorMessage = "Timeout";
            else
                errorMessage = "System Error";
            
            Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, ex);
            close();
        
        return statement;
    

    @Override
    public void close()
        try 
            if (statement != null) 
                statement.close();
            
            if(connection != null)
                connection.close();
            
        errorMessage = null;
         catch (SQLException e) 
            errorMessage = "Close Connection Error";
        
    

    @Override
    public String getErrorMessage() 
        return errorMessage;
    

    @Override
    public String getSql() 
        return sql;
    



【问题讨论】:

【参考方案1】:

我已经解决了我的问题。我的问题是因为连接池和数据库之间的连接。由于不同网络中的服务器和数据库导致超时问题,数据库自动关闭连接。

【讨论】:

即使对我来说也有同样的问题。你是如何解决这个问题的?请给我们一些解决的步骤。 问题可能出在您的连接池或数据库中,与Java端无关。对我来说,这是一个数据库配置问题,因为服务器位于不同的网络中,所以数据库阻止了连接。 @Raj

以上是关于Glassfish RAR5035:从池中销毁资源时出现意外异常的主要内容,如果未能解决你的问题,请参考以下文章

Anylogic,根据特定条件从池中抢资源

12-线程池

[转]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

从池中选择属性的算法

超时时间已到,但是尚未从池中获取链接

Java面试经典题:线程池专题