2016-05-27 57 views
0

我有一個Java EE Web應用程序。我正在使用JDBC連接數據庫,並且正在使用JDBC連接池。我的應用程序的主頁是登錄頁面。在我進入登錄頁面並等待一段時間後,我始終如一地使用此Glassfish服務器(4.1.0)警告。Glassfish RAR5035:從池中銷燬資源時出現意外異常

Warning: RAR5035:Unexpected exception while destroying resource from pool OraclePool. Exception message: Error while destroying resource :IO Error: Socket read timed out

即使我沒有在頁面上做任何操作。當我監測連接池的統計數據時,NumConnCreated正在不斷增加。我該如何解決這個問題?謝謝。

pool_statistics_image

這是我的管理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; 
    } 


} 

回答

0

我已經解決了我的問題。我的問題是因爲連接池和數據庫之間的連接。數據庫自動關閉連接,因爲不同網絡中的服務器和數據庫導致超時問題。

相關問題