Hallo,
ich habe zwei kleine Servlets, beide lesen Bilddaten aus einer MySQL-Datenbank. Nach einer Weile, ungefähr einem halben Tag, funktioniert eines der beiden oder auch beide nicht mehr. In den Logfiles sind keine Ausgaben zu erkennen, obwohl ich alle Exceptions (IOException/SQLException) mit out.println( ioe/sqle ) behandle.
Nebenbei läuft noch OpenCMS (basiert auch auf servlets), das davon scheinbar völlig unberührt bleibt.
Nach einem Neustart von Tomcat läuft der Dienst wieder.
Der Speicherverbrauch scheint sich nicht wesentlich zu verändern, über den Schalter "Xms" habe ich catalina ~700MB RAM gegönnt.
Zusammengefasst:
Die Datenbank läuft (OpenCMS zieht _alles_ aus der Datenbank), Tomcat läuft, aber eines meiner beiden Servlets "verweigert" seinen Dienst unabhängig von allen anderen.
Liegt das eher an der Ausgabe über den "BufferedOutputStream" oder an der Datenbankverbindung? Gibt es bei diesen beiden irgend etwas generelles zu beachten, dass ich vergessen habe?
Ich poste mal nur ein Servlet
Für Kommentare wäre ich dankbar,
mamue
ich habe zwei kleine Servlets, beide lesen Bilddaten aus einer MySQL-Datenbank. Nach einer Weile, ungefähr einem halben Tag, funktioniert eines der beiden oder auch beide nicht mehr. In den Logfiles sind keine Ausgaben zu erkennen, obwohl ich alle Exceptions (IOException/SQLException) mit out.println( ioe/sqle ) behandle.
Nebenbei läuft noch OpenCMS (basiert auch auf servlets), das davon scheinbar völlig unberührt bleibt.
Nach einem Neustart von Tomcat läuft der Dienst wieder.
Der Speicherverbrauch scheint sich nicht wesentlich zu verändern, über den Schalter "Xms" habe ich catalina ~700MB RAM gegönnt.
Zusammengefasst:
Die Datenbank läuft (OpenCMS zieht _alles_ aus der Datenbank), Tomcat läuft, aber eines meiner beiden Servlets "verweigert" seinen Dienst unabhängig von allen anderen.
Liegt das eher an der Ausgabe über den "BufferedOutputStream" oder an der Datenbankverbindung? Gibt es bei diesen beiden irgend etwas generelles zu beachten, dass ich vergessen habe?
Ich poste mal nur ein Servlet
Code:
public class ReadThumbnail extends HttpServlet {
Connection connection = null; //wird nur initialisiert, sofern null -> in getConnection()
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
Class.forName( "com.mysql.jdbc.Driver" );
}
catch( ClassNotFoundException cnfe ) {
//out.println( cnfe ); //schlechte Karten, in init habe ich noch kein "out"
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType( "image/jpeg" );
BufferedOutputStream bufferedOut =
new BufferedOutputStream( res.getOutputStream() );
PrintWriter out = new PrintWriter( bufferedOut );
HttpSession session = req.getSession();
String thumbnail_id =
req.getParameter( "thumbnailID" );
int thumbnailID = -1;
if( thumbnail_id != null ) {
thumbnailID = 8;
try {
thumbnailID = Integer.parseInt( thumbnail_id );
}
catch( NumberFormatException nfe ) {
thumbnailID = 2;
}
}
else {
thumbnailID = 1;
}
try {
readThumbnail( thumbnailID, bufferedOut );
}
catch( SQLException sqle ) {
out.println( sqle );
}
catch( IOException ioe ) {
out.println( ioe );
}
} //doGet
protected Connection getConnection() throws SQLException {
String dbUser = "dont-ask";
String dbPass = "wont-tell-ya";
String dbHost = "localhost";
String dbURL = "jdbc:mysql://localhost:3306/not-even-this";
return getConnection( dbUser, dbPass, dbHost, dbURL );
}
protected Connection getConnection( String dbUser,
String dbPass,
String dbHost,
String dbURL ) throws SQLException {
if( connection != null ) {
return connection;
}
connection = DriverManager.getConnection( dbURL, dbUser, dbPass );
return connection;
}
public void readThumbnail( int id,
BufferedOutputStream outputStream ) throws SQLException, IOException {
Connection con = getConnection();
String query = "select thumbnail from some-table "
+ "where photoID = ?";
PreparedStatement pstmt =
con.prepareStatement( query );
pstmt.setInt( 1, id );
ResultSet rs = pstmt.executeQuery();
if( rs.next() ) {
InputStream is = rs.getBinaryStream( 1 );
if( is != null ) {
BufferedInputStream in = new BufferedInputStream( is );
byte b[] = new byte[ 8 ];
int count;
while( ( count=in.read( b ) ) != -1 ) {
outputStream.write( b, 0, count );
}
outputStream.flush();
in.close();
} //if is != null
} //if rs.next()
} //readThumbnail throws SQLException, IOException
} //class ReadThumbnail
Für Kommentare wäre ich dankbar,
mamue