Avant toute chose, bonne année à tous.

J'ai un soucis depuis 3 semaines qui ressort sur une appli qui tourne depuis un an sans soucis, donc sans idées sur le pourquoi je vous le soumets.

Symptomes:
Depuis 3 semaines j'ai eu 3 crash d'index et une perte totale d'un fichier de données. Si j'avais un petit doute au début (après des mois de traitements sans incidents) je n'en ai plus, il y a un soucis qqpart.

contexte :
Une application sous java en multi thread qui utilise 2 tables MYSQL (5.0.27).
Les tables sont super simples avec une dizaine de colonnes chacune.
Chaque table a une classe dédiée métier qui s'occupe des requêtes.
Des transactions arrivent par socket d'un système externe.
Pour chacune d'elle un thread qui s'occupe d'effectuer un traitement approprié avec accès sur 2 tables (création/modification/..) est lancé.
Plusieurs thread de traitement peuvent être lancés en même temps (si plusieurs transactions entrantes).
Chaque thread de traitement instancie les 2 classes d'accès aux tables.
Tout (semble) bien parallèle, bien protégé.
Il y a une variable connection (jdbc) en globale static pour toute l'application initialisée dès le début.
Cette connection est passée à chaque nouvelle instance de classe d'accès aux tables créée par les threads de traitement.
Code :

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
//skeleton COLUMN access TABLE
public DBTx implements K
{
  private Connection          cx          = NULL;
  private Statement           stm        = NULL;
 
  public DBTx (Connection connection) throws SQLException
  {
    cx = connection;
    IF (cx != NULL)
      stm = cx.createStatement();
  }
 
 String Get (String KEY)
 {
   Resultset rs=NULL
   String value="",query="";
   try
   {
      query="...";
      rs = stm.executeQuery(query);
      //traitement du rs ..
   }
   catch (SQLException e)
   {
   }
   finally
   {
     rs.close();
   }
   RETURN value;
 }
 
 String Process (String KEY)
 {
   Resultset rs=NULL
   String value="",query="";
   try
   {
      query="...";
      rs = stm.executeQuery(query);
      //traitement du rs ..
      ...
   }
   catch (SQLException e)
   {
   }
   finally
   {
     rs.close();
   }
   RETURN value;
 }
 
 BOOLEAN UPDATE (String KEY, String DATA[])
 {
   String query="";
   BOOLEAN ok=false;
   try
   {
      query="...";
      stm.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 
      ...
      ok=true;
   }
   catch (SQLException e)
   {
   }
   finally
   {
   }
   RETURN ok;
 }

Chaque classe instanciée a en global une variable statement et en local à chaque méthode un resultset qui est fermé à la fin de chaque méthode.

Le statement doit il être local à chaque méthode (ds le cas où 2 méthodes de la même classe sont appelées en même temps) ?
Doit il être clôturé obligatoirement ?
Comme c le driver qui gère les accès simultanés en lecture/création, seuls les update devraient être managés par des synchronized ou lock donc normalement quid des telescopages donc je suis dans le noir.

Merci de votre aide et suggestion à tous.