# Tomcat mit Servlets Problem



## ThLu (25. Jan 2012)

Hallo zusammen,

ich habe ein Problem und zwar habe ich einen Service in einem Tomcat 7 deployed. Nach dem Re-Deploy meldet der Tomcat immer Speicherprobleme. Wie ich in bereits durch googeln erfahren habe, besteht das Problem darin, dass noch alte Instanzen des Services nach einem Re-Deploy vorhanden sind. Das nehme ich jetzt einfach mal hin, obwohl der Tomcat 7 Besserung versprochen hatte.
Allerdings habe ich noch ein Problem und zwar brechen meine Services alle 1-2 Tage immer mal ab, bzw. wenn ich sie über die URL aufrufe, dann kommt nach ein paar Tagen keine Antwort mehr, sondern der Ladekreis dreht sich einfach nur noch. Anfangs läuft noch alles wunderbar.

Folgenden Code benutzt ich:
(Zu Präsentationszwecken habe ich alles in Test genannt)

Servlet:

```
package de.test.servlets.get;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import de.test.servlets.help.TestServlet;
import de.testrest.datalogic.Manager;

/**
 * Servlet implementation class AllCategories
 */
public class AllCategoriesGetServlet extends TestServlet {
	private static final long serialVersionUID = 1L;
	
	private de.test.get.AllCategoriesGet ref;
	private String answer;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AllCategoriesGetServlet() {
        super();
    }

    public void init() throws ServletException {
		ref = new de.test.get.AllCategoriesGet();
	}
    
    public void destroy() {
    	ref = null;
    	answer = null;
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("application/xml;charset=UTF-8");
		response.setHeader("Content-Disposition", "attachment; filename=AllCategories.xml");

		answer = ref.loadAllCategories();
		
		PrintWriter out = response.getWriter();
		out.println(answer);
	}

}
```

Meine Zwischenschicht:


```
package de.test.get;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import de.testrest.datalogic.ParameterItem;
import de.testrest.datalogic.Manager;

@Path("/GET/AllCategories")
public class AllCategoriesGet {

	// This method  is called if XML is request
	@GET
	@Produces(MediaType.TEXT_XML)
	public String loadAllCategories(){
		String testString = Manager.getInstance().loadAllCategories();
		Manager.getInstance().getDb_handle().close();
		return testString;
	}
	
}
```

In der Logik wird dann nur der testString über eine Datenbankabfrage gefüllt.

Erkennt ihr irgendwas an dem Code was das Problem auslösen könnte?

Vielen Dank.

Mit freundlichem Gruß,
Thomas.


----------



## JanHH (26. Jan 2012)

Kann das mit den Speichereinstellungen zusammenhängen? Kenen das Problem vom JBoss auch. Vor alle "permGen Space" ist ein Problem. Hat die java-VM ausreichend Speicher zur Verfügung? Könnte mir vorstellen dass der Tomcat mit den default-Einstellungen da zu knapp ausgestattet ist.


----------



## maki (26. Jan 2012)

Was sagen denn die Logs?


----------



## ThLu (26. Jan 2012)

Danke schön für die Antworten.
Ich werde sobald das Problem wieder auftritt die Logs hier posten.

Viele Grüße,
Thomas.


----------



## DerFeivel (26. Jan 2012)

Ich hab hier gerade keine Möglichkeit das zu testen. 

Allerdings würde mich ad-hoc mal brennend interessieren, was die Jax-RS annotationen an deiner Zwischenschicht sollen.

Wenn du jetzt noch eine Application-Unterklasse oder eine entsprechend konfigurierte web.xml hast, hast du mit einer JAXRS-Endpunkt-Implementierung (wie sie deine AllCategoriesGet dann darstellt) ja dann zwei Servlets. 
Wenn dann das eine Servlet (deine eigentliche Servlet-Klasse) deinen JAX-RS Endpunkt direkt aufruft, bereitet mir das gerade irgendwie unbehagen. Sprich ich kann mir vorstellen, dass deine Speicherprobleme daher resultieren.


----------



## jwiesmann (26. Jan 2012)

Vielleicht hilft es schon, deinen Stream zu schließen.

```
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
try {        

        response.setContentType("application/xml;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=AllCategories.xml");
 
        answer = ref.loadAllCategories();
        

        out.println(answer);
} finally {
 out.close();
}  
    }
```

Gruß!


----------



## ThLu (26. Jan 2012)

@JanHH: Genügend Speicher ist definitiv vorhanden.

@DerFeivel: Ich hatte damals ein Tutorial gemacht, da wurden die Annotationen verwendet. Ich habe eine zusätzliche web.xml geplegt die das Mapping der Servlets übernimmt. Ich habe die Annotationen jetzt mal rausgeworfen, ob es was bringt erfahre ich hoffentlich bald 

@jwiesmann: Deinen Tipp habe ich auch berücksichtigt. Danke.

Danke schön für die ganzen Antworten.

Ich habe jetzt noch etwas gemacht und zwar habe ich mehrere Services die die gleichen jars verwenden. Ich habe jetzt alle jars mal in den Tomcat/lib gepackt. Ich habe geteilte Meinungen dazu gelesen im Internet. Die einen sagen "Auf keinen Fall" da dann alle darauf zugreifen und eventuell manche jars nicht für mehrere Anwendungen ausgelegt sind, die anderen sagen "Auf jeden Fall" da der Tomcat dann seine Libraries verwaltet. Was meint ihr?

Viele Grüße,
Thomas.


----------



## HimBromBeere (27. Jan 2012)

Also ich würde immer Bibliotheken dahin legen, wo sie gebraucht werden, um mal im JAVA-Sprech zu bleiben: so privat wie möglich. Auerßdem ist das Programm so leichter portierbar, weil du einfach deine gesamte WebApp anpacken und kopieren kannst, anstatt erstmal überall nach etwaigen Ressourcen zu suchen. Aber "auf KEINEN Fall" würd ich auch nicht gleich sagen... es ist - soweit ich weiß - erstmal nicht schädlich


----------

