Bonjour,

je travail avec Tomcat 5.5, Java et JSP.
J'ai une page JSP contenant une table:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<h:dataTable id="logDetails" var="item"
    value="#{logDetails.items}" styleClass="standardTable"
    headerClass="standardTable_Header"
    footerClass="standardTable_Header"
    rowClasses="standardTable_Row1,standardTable_Row2"
    columnClasses="standardTable_Column,standardTable_Column,standardTable_ColumnCentered,standardTable_ColumnCentered,standardTable_ColumnCentered,standardTable_Column">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Time" />
        </f:facet>
        <h:outputText value="#{item.CreationTime}" style="font-size: 10px" >
            <f:convertDateTime pattern="HH:mm:ss" />
        </h:outputText>
    </h:column>
.......
Cette table est "remplie" avec son bean Java:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Vector getItems() throws SQLException
{
    Connection connection = DBHelper.getDBConnection();
    try
    {
        PreparedStatement stmt = connection.prepareStatement(SQL_SELECT_LOG_DETAILS);
        stmt.setString(1, sessionID);
        ResultSet rs = stmt.executeQuery();
        return ResultSupport.toVector(rs);
    }
    finally
    {
        connection.close();
    }
}
et ma fonction Java, toVector:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static Vector toVector(ResultSet rs) throws SQLException
{
    ResultSetMetaData rsmd = rs.getMetaData();
    int noOfColumns = rsmd.getColumnCount();
    String[] columnNames = new String[noOfColumns];
    for (int i = 1; i <= noOfColumns; i++)
    {
        columnNames[i-1] = rsmd.getColumnName(i);
    }
    Vector result = new Vector();
    while (rs.next())
    {
        SortedMap<String, Object> columnMap = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
        for (int i = 0; i < noOfColumns; i++)
        {
            Object value = null;  
            if (rsmd.getColumnType(i) == Types.CLOB)
            {
                value = rs.getString(i); // workaround for TEXT datatype
            }
            else
            {
                value = rs.getObject(i);
            }
            if (rs.wasNull())
            {
                value = null;
            }
            columnMap.put(columnNames[i-1], value);
        }
        result.add(columnMap);
    }
    return result;
}
Pour accéder à cette page j'ai un lien depuis une autre page. J'ai remarqué que chaque fois que je clique sur ce lien, la mémoire utilisé pas Tomcat (gestionnaire de taches) augment à chaque fois, elle ne rédiminue plus quand je change de page. Je crois que c'est ça la cause mon problème.
Si je clique sur ce lien plusieurs fois (genre utilisateur stressé qui veut vite ouvrir et qui ne sais pas que cliquer plusieurs fois ne sert à rien ) et que la table est grosse (~60 lignes) j'ai une erreur de "Java heap space".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
javax.servlet.ServletException: Java heap space
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
    org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
 
javax.faces.FacesException: Java heap space
 
org.apache.jasper.JasperException: Java heap space
 
javax.servlet.ServletException: Java heap space
 
java.lang.OutOfMemoryError: Java heap space
à partir de ce moment la, je ne peux presque plus rien ouvrir de mon site web, j'ai toujours cette erreur. A part des toutes petites tables (2lignes).

J'ai remarqué que si j'ouvre des pages contenant des tables plus petites (~40 lignes), j'ai une autre erreur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
javax.servlet.ServletException: org.apache.jasper.JasperException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
    org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
 
javax.faces.FacesException: org.apache.jasper.JasperException
 
org.apache.jasper.JasperException
 
java.lang.ArrayIndexOutOfBoundsException
Je peux vous donner la trace complète de la cause mère de cette erreur, si nécessaire. Et d'autres parties de code?

Ma question est: comment gérer ça? Comment éviter l'erreur, ou au moins éviter de devoir redémarrer Tomcat si cela arrive??

Je ne veux pas augmenter la taille de la mémoire alloué, en cas normal c'est suffisant...et le mieux serais que la mémoire utilisé par Tomcat n'augmente sans cesse...

J'espère que quelqu'un ici puisse m'éclairer un peut...