私は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
が連続的に増加しています。どうすれば問題を解決できますか?ありがとうございました。
これは私のマネージド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;
}
}