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:从池中销毁资源时出现意外异常的主要内容,如果未能解决你的问题,请参考以下文章
[转]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。