2016-04-30 54 views
0

我有一个使用JNDI连接轮询(DB服务器是MySQL的)一个Web应用程序的工作,的Java连接池(JNDI)不affter半ADAY

有很多请求的Web应用程序,它有一个Web服务由另一个Web应用程序使用。

它工作得很好,但没有作品和Web服务的一些没有处理的命令经过一段时间后,会出现如下错误:

值java.sql.SQLException:无法获取的连接,一般错误 javax.naming.NameNotFoundException:在此上下文中未绑定名称[java:/ comp/env]。无法找到[java:]。

我把应用程序复制放在下面。

请注意,我强迫应用程序打印

新的连接时,“+++++ ===== >>>>连接的X号”(如果它是新的连接X增加)

后关闭连接“------ ===== >>>>连接数X”

注意2:每当Web服务被称为“%%%% >>>>> Web服务请求“字符串将被打印输出,然后”SELECT“命令将运行并打印输出,但是当系统崩溃时请求接收到的Web服务,但不能继续。

因此,请查找“+++++ ===== >>>>”和“+++++ ===== >>>>”,并注意“%% %% >>>>> Web服务请求“在开始和结束时。

的出放像如下:

java out put file

public void close() throws SQLException { 
    connection.close(); 
    counter--; 
    ServerLog.Print("------=====>>>> number of connection " + counter); 
    ServerLog.Print("Database connection is closed ..."); 
} 

这是一些方法如下:

public jjDatabaseWeb() throws SQLException, NamingException { 
    ctx = new InitialContext(); 
    Context initCtx = (Context) ctx.lookup("java:/comp/env"); 
    DataSource ds = (DataSource) initCtx.lookup("jdbc/MyDB"); 
    connection = ds.getConnection(); 
    counter++; 
    ServerLog.Print("+++++=====>>>> number of connection " + counter); 
} 

,并在下面是调用哪个白衣其他服务的Web服务方法在局域网中:

/** 
* this Method returns a string result; if(result =="" OR result==null){ do 
* your work }else{ show user result as message (result is HTML) } 
* 
* @param stdNubmer 
* @param nationalId Is not important 
* @return String result (as HTML) 
* @throws javax.naming.NamingException 
*/ 
@WebMethod(operationName = "studentCheck") 
public String studentCheck(@WebParam(name = "stdNubmer") String stdNubmer, @WebParam(name = "nationalId") String nationalId) { 

    try { 
     ServerLog.Print("%%%%>>>>> web Service request for :" + stdNubmer); 
     try { 
      jjDatabaseWeb db = new jjDatabaseWeb(); 
      DefaultTableModel dtm = db.Select(StdInfo.tableName, StdInfo._step + "," + StdInfo._alerts + "," + StdInfo._lastAertDate + "," + StdInfo._name + "," + StdInfo._family, StdInfo._stdNumber + "=" + stdNubmer); 
      List<Map<String, Object>> row = jjDatabaseWeb.separateRow(dtm); 
      db.close();// 
      if (row.size() == 1) { 
       if (!row.get(0).get(StdInfo._step).toString().equalsIgnoreCase("5")) { 
        int date = new jjCalendar_IR().getDBFormat_8length(); 
        int lastAlertDate = Integer.parseInt(row.get(0).get(StdInfo._lastAertDate).toString()); 
        int alerts = Integer.parseInt(row.get(0).get(StdInfo._alerts).toString()); 
        if ((date - 5) <= lastAlertDate) { 
         return ""; 
        } 
        StringBuilder html = new StringBuilder(""); 
        html.append("<HTML>...</HTML>"); 
        return html.toString(); 
       } 
      } 
      return ""; 
     } catch (NamingException ex) { 
      Logger.getLogger(csaWebService.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(csaWebService.class.getName()).log(Level.SEVERE, null, ex); 
     ServerLog.Print(ex); 
     Server.ErrorHandler(ex); 
     return ""; 
    } 
    return ""; 
} 

}

+0

使用jndi有什么特别的理由吗? – Fildor

+0

这是一个非常繁忙的系统,所以我认为如果我使用jndi来集中连接会更好。所以现在我无法改变它。我必须解决这个问题。 – user3600935

+0

过早优化的典型例子。您现在必须调试您的JNDI池。 :(我想你将不得不在这里添加一些代码来获得适当的帮助。 – Fildor

回答

0

有这么多的连接,女巫打开,没有关闭。

小心close()连接。