Bonjour,

J'ai un process utilisant JDBC qui connecte au serveur Sybase pour l'extraction des données. De temps en temps (pas souvent) j'ai cette erreur


jvm 1 | 2009/08/24 21:51:17.168 | com.sybase.jdbc3.jdbc.SybSQLException: Your server command (family id #0, process id #201) encountered a deadlock situation. Please re-run your command.
INFO | jvm 1 | 2009/08/24 21:51:17.168 |
INFO | jvm 1 | 2009/08/24 21:51:17.168 | at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
INFO | jvm 1 | 2009/08/24 21:51:17.168 | at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
INFO | jvm 1 | 2009/08/24 21:51:17.168 | at com.sybase.jdbc3.tds.TdsResultSet.nextResult(Unknown Source)
INFO | jvm 1 | 2009/08/24 21:51:17.168 | at com.sybase.jdbc3.tds.TdsResultSet.next(Unknown Source)
INFO | jvm 1 | 2009/08/24 21:51:17.168 | at com.sybase.jdbc3.jdbc.SybResultSet.next(Unknown Source)
Je souhaite de ré-exécuter cette commande SQL x fois (x est un paramètre indiquant le nombre d'exécutions si la commande SQL rencontre cette erreur) mais je ne trouve pas une solution satisfaisant.

Fonction pour extraire les données
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

public static Object getObjectFromDb(final Connection connection,
                                     String           storedProcedure,
                                     DateTime         date,
                                     String           instrument,
                                     String           typeObject) throws SybSQLException
{
    Object result = null;
    ResultSet rs = null;
    CallableStatement cst = null;
    StringBuilder sb = new StringBuilder();
    try
    {
        cst = connection.prepareCall(storedProcedure);
        cst.setDate(1, new java.sql.Date(date.getMillis()));
        cst.setString(2, instrument);
        cst.setString(3, typeObject);

        rs = cst.executeQuery();

        while (rs.next())
        {
            sb.append(rs.getObject("M_OBJECT"));   
        }
        result = sb;
    }
    catch (IOException e)
    {
         System.err.println(e.getMessage());
    }
    catch (SQLException e)
    {
         System.err.println(e.getMessage());
    }
    finally
    {
         try
         {
              rs.close();
         }
         catch (Exception e)
         {
         }
         try
         {
             cst.close();
         }
         catch (Exception e)
         {
         }
    }
    return result;
}

Programme appelant la fonction ci-dessus, au lieu du test counter != 0, je souhaite faire counter != nbTimes mais je ne sais pas comment

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
35
36

public void static getData(final Connection connection,
                           String           storedProcedure,
                           DateTime         date,
                           String           instrument,
                           String           typeObject,
                           int              nbTimes)
{
    Object result = null;
    int counter = 0;
    try
    {
         result = getObjectFromDb(connection, storedProcedure, date, instrument, typeObject);
    }
    catch (SybException e)
    {
         System.err.println(e.getMessage());
         counter++;
    }
    finally
    {
         try
         {
              if (counter != 0)
              {
                   result = getObjectFromDb(connection, storedProcedure, date, instrument, typeObject);
              }
         }
         catch (Exception e)
         {
             System.err.println(e.getMessage());
         }
    }
    return result;
}
Merci d'avance