# send riesige "Query" to servlet



## sindylee2 (24. Nov 2011)

Moin alle Experten,

ich habe ein Problem beim Senden von einem riesigen (MegaByte) String zu Servlet, Es hängt entweder ab oder nach lange Zeit s****** ein Exception aus: "query is null". Bei kleinem "String" klappt das gut. Wie kann man besser machen?


```
//Kleintseite Code: 
String query =
            ....
            "&" + "plan=" + plan+  //plan is der riesige String....
            "&" + "xslt=" + encodedxslt;
            
        DataProvider dp = DataProvider.getInstance();
        String servletUri = ....;   
        // make the connection
        
        URL servletURL = new URL(servletUri);
        URLConnection urlConnection = servletURL.openConnection();
        HttpURLConnection connection = (HttpURLConnection)urlConnection;
        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setRequestProperty("accept", DataProviderDefinitions.CONTENT_TYPE_BINARY_DATA + ", " + DataProviderDefinitions.CONTENT_TYPE_PLAIN_TEXT);
        connection.setReadTimeout(0);
       .......
        //send Query
         OutputStream os = connection.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            pw.print(query);            
            pw.flush();
            .....
```


----------



## maki (24. Nov 2011)

Sende deine Daten im Body per POST und nicht in der URL per GET.


----------



## irgendjemand (24. Nov 2011)

@MOD

jo man sollte lesen können ... er versendet seinen request via HTTP-POST ... *fail*


@TO

falls du zugriff drauf hast : wirf mal einen blick ins server-log ... es könnte sein das du irgendwelche LIMIT oder TIMEOUT werte überschreitest und der server daher die verarbeitung abbricht ...
auch interressant : bis zu welche größe läuft das gewünschte und ab wann treten probleme auf ? wie hoch ist dein upstream zum server oder testet du lokal / im lan ?

ein paar wenig infos um effektiv helfen zu können


----------



## sindylee2 (24. Nov 2011)

es sage einfach "query is null", auf kleintseite und Server-log habe ich die wichtige Infomationen ausgegeben. die Ausgabe von Kleintseit sind alle vernünftig, aber auf serverseite gibt gar nichts aus ausser das "NullPointerException" ....(((


hat das eingentlich mit Query-length zu tun? wie kann man das herausfinden, wo das Problem liegt, ist das wirklich die String zu lang? oder irgendwann wurde die Verbindung unterbrochen?


----------



## Empire Phoenix (24. Nov 2011)

Versuch mal dieses stück hier, das setzte ich in einem System ein und es hat bislang nie fehler gemacht. 

Wesentlicher unterschied ist eigntlich, dass ich viel weniger krams setze, dafür aber das encoding explizit angebe.


```
URL url = new URL(weburl); 
		 URLConnection conn = url.openConnection();
		 conn.setDoOutput(true);
		 OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(),"Cp1252");
		 writer.write(data);
         writer.flush();
```

Am rande, kannst du plz die zeile und den genauen wortlauf worauf sich die excpetion bezieht markieren?


----------



## sindylee2 (25. Nov 2011)

Danke, aber leider funktioniert auch nicht:cry:

ich habe noch mal so versucht: 

```
URL servletURL = new URL(servletpath);
                URLConnection urlConnection = servletURL.openConnection();
                connection = (HttpURLConnection)urlConnection;
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setRequestMethod("PUT");
                connection.setRequestProperty("accept", DataProviderDefinitions.CONTENT_TYPE_BINARY_DATA + ", " + DataProviderDefinitions.CONTENT_TYPE_PLAIN_TEXT);
                connection.setReadTimeout(0);
.......

//sed request
if(connection != null)
        {
 
          OutputStream os = connection.getOutputStream();
          
          if(os == null)
          {
              throw new Exception("CWAPIForWebServlet.takePlanForEditorial(..): OutputStream is null.");
          }
          
          DataOutputStream dos = new DataOutputStream(os);
          
          // send the parameter
          
          dos.writeUTF(encodedUrlString); 
          dos.writeUTF(encodedxslt);         
          ObjectOutputStream oo = new ObjectOutputStream(dos);
          oo.writeObject(plan);  //big monster!  (26MB)
         
          try
          {
              oo.close();
              
          } catch(Exception any){
          	System.out.println("Exception by oo close");
          }
          try
          {
              dos.flush();
              
          } catch(Exception any){
          	System.out.println("Exception by dos flush");
          }
          try
          {
              dos.close();
              
          } catch(Exception any){
          	System.out.println("Exception by dos close");
          }
          try
          {
              os.close();
              
          } catch(Exception any){
          	System.out.println("Exception by os");
          }        	


             //get Respons and disconnect...
             InputStream is = connection.getInputStream();   //beim Großen String macht here immer Error Code 500!  warum?
             .....
                    try
        {
            connection.disconnect();
            
        } catch(Exception any){}
            okay = (res != null && res.equals(DataProviderDefinitions.VALUE_TRUE));
        }
```

und das funktioniert auch nicht bei großen String.... hat das mit Base64 Encoding zu tun?
ich habe vorher versucht mit Base64.encode(plan); zu machen, aber das ist für "ObjectOutputStream"
nicht geeignet, gibt immer Fehlermeldung zurück, dann schicke ich einfach "plan" ohne Kodierung, dann hat zwar das ObjectOutputStream kein Problem mehr, aber arbeitet er nur für kleine String.......


----------



## Empire Phoenix (25. Nov 2011)

Kann das ganzer evtl ne serverconfiguration sein? Dass der nur bis bestimmte größen post parameter annimmt? Oder timeouts für uploads hat?


----------



## sindylee2 (25. Nov 2011)

Du hast absolute recht ! Nach zwei Tage hard Suchen, endlich habe ich festgestellt, dass der Fehler wegen niedrigen Tomcat-Speicherplatz war!

habe ich so geändert:


Obscured Clarity: Set Tomcat Memory Heap Size


----------

