IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

JDBC: problème verrouillage pessimiste.


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mumu27
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 213
    Par défaut JDBC: problème verrouillage pessimiste.
    J'essaye d'utiliser dans mon exemple, un verrouillage pessimiste.

    Voici les différents programmes utilisés:

    *JDBCManager.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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    package Ch07;
     
    import java.sql.*;
    import java.util.*;
     
    public class JDBCManager {
    	private JDBCManager() {
    	}
     
    	public static Connection getConnection(String url) throws SQLException {
    		return getConnection(url, true);
    	}
     
    	public static Connection getConnection(String url, boolean autocommit) throws SQLException {
    		Connection connection = DriverManager.getConnection(url);
    		connection.setAutoCommit(autocommit);
    		return connection;
    	}
     
    	public static Connection getConnection(
    		String url,
    		String user,
    		String password)
    		throws SQLException {
    		return getConnection(url, user, password, true);
    	}
     
    	public static Connection getConnection(
    		String url,
    		String user,
    		String password,
    		boolean autocommit)
    		throws SQLException {
    		Connection connection = DriverManager.getConnection(url, user, password);
    		connection.setAutoCommit(autocommit);
    		return connection;
    	}
     
    	public static Connection getConnection(String url, Properties props)
    	  	throws SQLException {
    		return getConnection(url, props, true);
    	}
     
    	public static Connection getConnection(
    		String url,
    		Properties props,
    		boolean autocommit)
    	  	throws SQLException {
    		Connection connection = DriverManager.getConnection(url, props);
    		connection.setAutoCommit(autocommit);
    	  	return connection;
    	}
     
    	public static void rollback(Connection conn) {
    		try {
    		  conn.rollback();
    		} catch (Exception e) {
    		  e.printStackTrace();
    		}
    	}
     
    	public static void close(Connection conn) {
    		if (conn != null) {
    		  try {
    		    conn.close();
    	  	  } catch (Exception e) {
    			e.printStackTrace();
    	  	  }
    	 	}
    	}
     
    	public static void close(Statement stmt) {
    	 	 if (stmt != null) {
    	 	   try {
    		     stmt.close();
    		   } catch (Exception e) {
    		  	 e.printStackTrace();
    		   }
    	   	 }
    	}
     
    	public static void close(ResultSet rset) {
    	  if (rset != null) {
    		try {
    		  rset.close();
    		} catch (Exception e) {
    		  e.printStackTrace();
    		}
    	  }
    	}
    }
    *PessimisticLockerA.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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    package Ch07;
     
    import java.sql.*;
     
    public class PessimisticLockerA {
      static Connection conn;
      static Statement stmt;
     
      static Statement stmtA;
      static PreparedStatement pstmt;
      static ResultSet rsetA;
     
      static String sqlCreate = "create table RESERVE " +
        "(ROOMID varchar(5), RES_DATE date, RES_FLAG boolean, " +
        "RES_NAME varchar(30))";
      static String sqlInsert = "insert into RESERVE values " +
        "(?, ?, ?, ?)";
      static String sqlUpdate = "update RESERVE set RES_FLAG=?, " +
        "RES_NAME=? WHERE ROOMID=? AND RES_DATE=?";
      static String sqlSelect = "select ROOMID, RES_DATE, " +
        "RES_FLAG, RES_NAME from RESERVE WHERE RES_FLAG=false FOR UPDATE";
     
      static String roomName;
      static java.sql.Date roomDate;
     
      public static void main(String[] args) {
    	try {
    	  String url = "jdbc:pointbase:server://localhost/pointbaseDB";
    	  String username = "PBPUBLIC";
    	  String password = "PBPUBLIC";
    	  conn = JDBCManager.getConnection(url, username, password, false);
    	  System.out.println("conn autocommit : " + conn.getAutoCommit());
    	  setup();
    	  userAQuery();
    	  System.out.println("Interruption de 15 second, " +
    	  					 "Lancer PessimisticLockerB");
    	  try {Thread.sleep(15000);} catch (Exception e) {}
    	    System.out.println("PessimisticLockerA est actif");
    	    userAUpdate();
      	  } catch (Exception e) {
    		e.printStackTrace();
      	  } finally {
    		JDBCManager.close(conn);
    	}
      }
     
      static void setup() throws SQLException {
    	System.out.println("Creation de la table RESERVE");
    	try {
    	  stmt = conn.createStatement();
    	  stmt.addBatch(sqlCreate);
    	  stmt.executeBatch();
    	  System.out.println("Insertion d'une ligne de donnees");
    	  pstmt = conn.prepareStatement(sqlInsert);
    	  pstmt.setString(1, "PIKE");
    	  pstmt.setDate(2, new java.sql.Date(System.currentTimeMillis()));
    	  pstmt.setBoolean(3, false);
    	  pstmt.setNull(4, java.sql.Types.VARCHAR);
    	  pstmt.executeUpdate();
    	  conn.commit();
    	} finally {
    	  JDBCManager.close(pstmt);
    	  JDBCManager.close(stmt);
    	}
      }
     
      static void userAQuery() throws SQLException {
    	System.out.println("L'utilisateur A demande une chambre");
    	stmtA = conn.createStatement();
    	rsetA = stmtA.executeQuery(sqlSelect);
    	if (rsetA.next()) {
    	  System.out.println("La requete retourne une ligne");
    	  roomName = rsetA.getString(1);
    	  roomDate = rsetA.getDate(2);
    	}
    	// Ni l'objet Statement ni l'objet ResultSet ne sont fermés ici
    	// Ils doivent rester ouverts userAUpdate()
      }
     
      static void userAUpdate() throws SQLException {
    	try {
    	  if (roomName != null && roomDate != null) {
    		System.out.println("L'utilisateur A tente de réserver la chambre");
    		pstmt = conn.prepareStatement(sqlUpdate);
    		pstmt.setBoolean(1, true);
    		pstmt.setString(2, "Utilisateur A");
    		pstmt.setString(3, roomName);
    		pstmt.setDate(4, roomDate);
    		int result = pstmt.executeUpdate();
    		if (result == 0) {
    		  System.out.println("La réservation n'a PAS réussi !");
    		  System.out.println("L'utilisateur devra essayer avec " +
    		  					 "une autre chambre ou une autre date");
    		} else {
    		  System.out.println("Validation pour l'utilisateur A");
    		  conn.commit();
    		}
      	  }
    	} catch (SQLException e) {
    	  e.printStackTrace(DriverManager.getLogWriter());
    	  System.out.println(e.getErrorCode());
    	  System.out.println(e.getMessage());
    	} finally {
    	  JDBCManager.close(pstmt);
    	  JDBCManager.close(rsetA);
    	  JDBCManager.close(stmtA);
    	}
      }
    }
    *PessimisticLockerB.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
    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
    package Ch07;
     
    import java.sql.*;
     
    public class PessimisticLockerB {
      static Connection conn;
      static Statement stmt;
      static Statement stmtB;
      static PreparedStatement pstmt;
      static ResultSet rsetB;
     
      static String sqlUpdate =
        "update RESERVE set RES_FLAG=?, "
          + "RES_NAME=? WHERE ROOMID=? AND RES_DATE=?";
      static String sqlSelect =
        "select ROOMID, RES_DATE, "
          + "RES_FLAG, RES_NAME from RESERVE WHERE RES_FLAG=false FOR UPDATE";
     
      static String roomName;
      static java.sql.Date roomDate;
     
      public static void main(String[] args) {
    	try {
    	  String url = "jdbc:pointbase:server://localhost/pointbaseDB";
    	  String username = "PBPUBLIC";
    	  String password = "PBPUBLIC";
    	  conn = JDBCManager.getConnection(url, username, password, false);
    	  System.out.println("conn autocommit : " + conn.getAutoCommit());
    	  userBQueryAndUpdate();
    	} catch (Exception e) {
    	  e.printStackTrace();
    	} finally {
    	  JDBCManager.close(conn);
    	}
      }
     
      static void userBQueryAndUpdate() throws SQLException {
    	System.out.println("L'utilisateur B tente de réserver la chambre");
    	try {
    	  stmtB = conn.createStatement();
    	  rsetB = stmtB.executeQuery(sqlSelect);
    	  if (rsetB.next()) {
    		System.out.println("L'utilisateur B réserve une chambre");
    		pstmt = conn.prepareStatement(sqlUpdate);
    		pstmt.setBoolean(1, true);
    		pstmt.setString(2, "User B");
    		pstmt.setString(3, rsetB.getString(1));
    		pstmt.setDate(4, rsetB.getDate(2));
    		pstmt.executeUpdate();
    		System.out.println("Validation pour l'utilisateur B");
    		conn.commit();
      	  } else {
    		System.out.println("Pas de chambre disponible pour l'utilisateur B");
      	  }
    	} catch (SQLException e) {
    	  e.printStackTrace();
    	  System.out.println(e.getErrorCode());
    	  System.out.println(e.getMessage());
    	} finally {
    	  JDBCManager.close(pstmt);
    	  JDBCManager.close(rsetB);
    	  JDBCManager.close(stmtB);
    	}
      }
    }
    Pour faire fonctionner le programme, j'ouvre deux fenêtres et je configure le classpath dans chacune d'elle comme ceci:

    set classpath=.;C:\Sun\AppServer\pointbase\lib\pbclient.jar
    Ensuite je tape cette commande dans une fenêtre:

    java -Djdbc.drivers=com.pointbase.jdbc.jdbcUniversalDriver Ch07.PessimisticLockerA
    Puis celle-ci dans l'autre:

    java -Djdbc.drivers=com.pointbase.jdbc.jdbcUniversalDriver Ch07.PessimisticLockerB
    J'exécute la première commande, j'ai ceci qui s'affiche:

    conn autocommit : false
    Creation de la table RESERVE
    Insertion d'une ligne de donnees
    L'utilisateur A demande une chambre
    La requete retourne une ligne
    Interruption de 15 second, lancer PessimisticLockerB
    Je lance PessimisticLockerB, voici le message d'erreur:

    java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getConnection(DriverManager.java:532)
    at java.sql.DriverManager.getConnection(DriverManager.java:532)
    at Ch07.JDBCManager.getConnection(JDBCManager.java:34)
    at Ch07.PessimisticLockerB.main(PessimisticLockerB.java:27)
    Là j'avoue que je ne comprends pas très bien, le programme semblait correct, puisque le JDBCManager avait été essayé sur un précédent programme qui marchait très bien.

    Enfin sur la première fenêtre, j'ai ces messages ci:

    PessimisticLockerA est actif
    L'utilisateur A tente de réserver la chambre
    La réservation n'a PAS réussi
    L'utilisateur devra essayer avec une autre chambre ou une autre date
    Si quelqu'un peut m'éclairer, je suis preneur.

    Merci d'avance, mumu27!

  2. #2
    Membre éclairé Avatar de mumu27
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 213
    Par défaut
    Bonjour en fait, j'ai dû faire une mauvaise manip, je n'ai plus le message d'erreur:

    java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getConnection(DriverManager.java:532)
    at java.sql.DriverManager.getConnection(DriverManager.java:532)
    at Ch07.JDBCManager.getConnection(JDBCManager.java:34)
    at Ch07.PessimisticLockerB.main(PessimisticLockerB.java:27)
    En revanche, j'ai toujours un problème, en effet après l'exécution de la classe PessimisticLockerA, j'ai bien ce que je veux:

    conn autocommit : false
    Creation de la table RESERVE
    Insertion d'une ligne de donnees
    L'utilisateur A demande une chambre
    La requete retourne une ligne
    Interruption de 15 second, lancer PessimisticLockerB
    Après je lance PessimisticLockerB et j'ai:

    conn autocommit : false
    L'utilisateur B tente de réserver la chambre
    Le traitement de la classe PessimisticLockerB s'interrompt. Jusqu'ici tout va bien. Mais après l'exécution de la classe Pessimisticl=LockerB reprend, voici le message:

    L'utilisateur B a réserve une chambre
    Validation pour l'utilisateur B
    Puis l'exécution de la classe PessimisticLockerA reprend:

    PessimisticLockerA est actif
    L'utilisateur A tente de reserver la chambre
    La reservation n'a PAS réussi !
    L'utilisateur devra essayer avec une autre chambre ou une autre date
    Hors lorsque le traitement de PessimisticLockerB s'interrompt, j'aurais souhaité lors de la reprise que cela soit PessimsticLockerA qui reprend, ainsi j'aurais eu:

    PessimisticLockerA est actif
    L'utilisateur A tente de réserver la chambre
    Validation pour l'utilisateur A
    Ensuite seulement la classe de la requête PessimisticLockerB se serait exécuté:

    Pas de chambre disponible pour l'utilisateur B
    Pouvez-vous me dire pourquoi, c'est la classe PessimisticLockerB qui apparemment redémarre en premier et pas PessimisticLockerA, afin que je puisse faire la correction de ce programme.

    Merci d'avance, mumu27!

  3. #3
    Membre éclairé Avatar de mumu27
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 213
    Par défaut
    J'ai oublié de préciser, j'utilise Tomcat 5.5, car je pense que cela peut être important.

    mumu27!

  4. #4
    Membre éclairé Avatar de mumu27
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 213
    Par défaut
    Erratum, je n'utilise pas Tomcat 5.5, mais le serveur J2EE de sun.

    Excusez-moi pour l'erreur.

    Mumu27!

  5. #5
    Membre éclairé Avatar de mumu27
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 213
    Par défaut
    Bonjour,

    finalement, j'ai testé les programmes sous un autre ordi qui est sous XP et les exemples fonctionnent parfaitement bien. Je ne sais, si le problème vient du fait que mon ordi est sous Windows 7 ou si le problème vient de l'antivirus que j'ai installé avec Windows 7, en l'occurrence, Norton. Si vous avez une idée d'où provient le disfonctionnement?

    mumu27!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/02/2005, 16h12
  2. Réponses: 3
    Dernier message: 08/12/2004, 21h11
  3. Réponses: 5
    Dernier message: 19/08/2004, 11h11
  4. [JTextField][JDBC] Problème d'affichage
    Par deathwing dans le forum JDBC
    Réponses: 4
    Dernier message: 12/05/2004, 14h50
  5. [JDBC] Problème avec les accents
    Par seawolfm dans le forum Administration
    Réponses: 2
    Dernier message: 29/01/2004, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo