2016-04-30 4 views
0

ich eine Web-App haben, die für die Verbindung Polling JNDI verwendet (DB-Server ist MySql),Java Verbindungspooling (JNDI) nicht affter eine halbe aday arbeiten

Es gibt viele Anfrage an Web-Anwendung, und es hat einen Web-Service Wird von einer anderen Webanwendung verwendet.

Es funktioniert gut, aber nach einer gewissen Zeit nicht funktioniert und nach einigen nicht verarbeiteten Befehle in Web-Service, wird der Fehler unter:

java.sql.SQLException: bekommen kann keine Verbindung, allgemeine Fehler javax.naming.NameNotFoundException: Name [java:/comp/env] ist in diesem Kontext nicht gebunden. Kann [java:] nicht finden.

Ich kopiere App aout setzen unten.

beachten Sie bitte i App zwingen zu drucken "+++++ ===== >>>> Anzahl der Verbindungs ​​X"

wenn für neue Verbindung (wenn es neue Verbindung X erhöht wurde)

und nach dem Schließen der Verbindung "------ ===== >>>> Nummer der Verbindung X"

Hinweis 2: Immer wenn der Webdienst als "%%%%% >>>>>" bezeichnet wird Web-Service-Anfrage für "Zeichenfolge wird in der output gedruckt werden und dann ein" SELECT "-Befehl wird ausgeführt und in der Ausgabe gedruckt, aber wenn System abgestürzt die Anfrage an den Web-Service erhalten, aber nicht fortfahren.

Suchen Sie also nach "+++++ ===== >>>>" und "+++++ ===== >>>>" und achten Sie auf "%% %% >>>>> Web-Service-Anfrage für "am Anfang und am Ende.

Die heraus gesetzt ist wie folgt:

java out put file

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

Dies sind einige Methoden unten:

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); 
} 

Und unten ist Web-Service-Methode, die Whit andere Dienste ruft im LAN:

/** 
* 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

Gibt es einen besonderen Grund für die Verwendung von JNDI? – Fildor

+0

Es ist ein sehr beschäftigt System, so dass ich denke, es ist besser, wenn ich jndi zu Pooling-Verbindung verwenden. So, jetzt kann ich es nicht ändern. Ich muss das Problem lösen. – user3600935

+0

Klassisches Beispiel für vorzeitige Optimierung. Sie müssen nun Ihr JNDI-Pooling debuggen. :(Ich denke, Sie müssen hier Code hinzufügen, um richtige Hilfe zu bekommen. – Fildor

Antwort

0

Es gab so viele Verbindungen, die geöffnet und nicht geschlossen wurden.

Seien Sie vorsichtig mit close() für Verbindungen.