2016-05-27 11 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(); 
} 

これは私が私の問題を解決した

@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

私のステートレスBeanクラスです。私の問題は、接続プールとデータベースの接続のためです。異なるネットワーク内のサーバーとデータベースがタイムアウトの問題を引き起こしたため、データベースは自動的に接続を閉じます。

関連する問題