Bonsoir à tous, j'ai un problème ennuyeux qui traine sans trop comprendre d'où cela vient, j'ai qd même remarqué 2 / 3 choses et je me demande si c'est la bonne méthode. Le soft tourne depuis plusieurs mois mais là il me fait des plantage d'index/crash de tables hasardeuses depuis quelques semaines une fois de temps en temps.
Contexte :
C'est un soft multithread qui va écrire sans arrêt des transactions dans plusieurs tables très simples. On m'a conseillé (sur ce site) une connection par thread qui se lance pour éviter les télescopagesde reqêtes/réponses, celle ci n'étant pas threasdsafe.
OK, j'ai mis en place un pool de connections donc efficacité en terme de demande ponctuelle par chaque thread qui démarre.
- Chaque table est accédée par une classe métier (il y en a 5).
- Chaque thread instancie les classes métiers avec sa connection demandé au pool, donc je me retrouve avec 5 tables/classes métiers utilisant la même connection.

Questions
  1. Chaque classe métiers doit-elle avoir sa propre connection plutôt que celle du thread ? si oui ca va faire lourd (le nb max de thread=10 * 5 tables=50 connections) ouf ?

  1. Chaque classe métier effectue une copie locale de la connection sur laquelle il alloue un statement en global de la classe, ne faudrait-il pas mieux allouer le statement dans chaque méthode comme le resultset et le clôturer une fois le traitement effectué plutôt que d'avoir toutes les méthodes utiliser le même statement ?

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;
 }
Merci de votre aide