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.
Partager