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 :

[J2EE/JSP] Gestion des erreurs avec une base SQL server 2005


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Bonjour,

    Voila dans le cadre de mon stage, je dois développer une application intranet basée sur J2EE (une CVthèque).
    L'architecture est la suivante:

    Conteneur Web: Tomcat 5.0.28 pour les JSP/servlet
    Base de données: SQL serveur 2005 Express Edition.
    Pour faire le pont entre les deux: Drivers JDBC

    J'aimerais connaitre la maniere la plus propre pour gerer mes Formulaire/traitements/connection/Gestion des exceptions?

    Pour l'instant j'ai une classe qui permet la connection a ma bd grace au drivers JDBC:

    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
     ----------------------------------------------------------
    package donnees;
     
    import java.sql.*;
     
    public class SessionSQLServer {
    private Connection conn;
    private ResultSet rst;
    private String url = "jdbc:sqlserver://PORTABLE:1433;databaseName=TEST;user=sa;password=sa";
     
    //Permet d'ouvrir une connection sur la base de données
    private void ouvrirConnection() throws SQLException {
    DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
    conn = DriverManager.getConnection(url);
    conn.setAutoCommit(true);
     
    }
    //Permet de fermer la connection vers la base de données
    private void fermerConnection() throws SQLException {conn.close();}
     
    public void addprofil() throws SQLException {
     
    ouvrirConnection();
     
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO PROFIL_PRO (PRO_LIB) VALUES ('tutu')"); 
     
    stmt.close();
    fermerConnection();
     
     
    }
     
    }
    ----------------------------------------------------------
    Pour la connection, j'ai vu le tutorial sur le pooling de connection (http://java.developpez.com/faq/j2ee/...TION_CONNEXION), mais j'ai vu seulement des exemple pour l'utiliser dans l'init d'une server.
    Les connections et requetes se fesant dans ma classe SessionSQLServer, puis je tout de meme utiliser la methode de pooling?

    Aprés je pense utiliser des procedures stockée dans ma bd. Cela vous parrait il un bon choix?

    Si j'utilise cette methode, j'aimerais faire la gestion des erreurs.
    En cours et en TP nous avons travaillé sur oracle.
    J'aimerais avoir ce type de traitements en jouant avec les codes relevée par SQL server:

    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
     -----------------------
    -- Creer un Adherent --
    -----------------------
    PROCEDURE creer_un_adherent(num_adh number, nom_adh varchar2, prenom_adh varchar2, rue_adh varchar2, addr_adh varchar2, cp_adh varchar2, ville_adh varchar2) IS
    BEGIN
    set transaction read write;
    INSERT INTO ADHERENT_ADH VALUES(num_adh, nom_adh, prenom_adh, rue_adh, addr_adh, cp_adh, ville_adh);
    COMMIT;
    exception
    when others then
    if sqlcode = -00001 then /* viol des contraintes uniques */
    rollback;
    raise_application_error(-20002, 'L''adhérent '||num_adh||' existe déjà');
    elsif sqlcode = -00060 then /* problème d'interblocage */
    rollback;
    raise_application_error(-20099, 'Opération impossible pour cause d''interblocage');
    else /* erreur inattendue */
    rollback;
    message := 'sqlcode :'||sqlcode||' '||substr(sqlerrm,1,100);
    raise_application_error(-20100, 'Erreur inattendue : '||message);
    end if;
    END;
    Seulement je trouve très peu de chose sur les codes exception SQL server et sur les transactions, commit et rollback...

    Cela vous parait il une bonne solution??

    Pour gerer les erreur pour l'instant, j'ai créer uen page jsp error.jsp avec le tag <%@ page isErrorPage="true" %> qui me permet de relever les erreurs courrantes.

    Grace au throws SQLException dans ma classe de connection, je peux remonter les erreurs.
    Mais j'aimerais savoir comment bien traiter ces erreurs pour mon interface.
    Exemple avec un simple formulaire d'insertion d'un adherent dans une table:

    Lorsque l'utilisateur clique sur valider, dois-je rappeller la meme page avec un test qui effectue le traitement entouré d'un try/catch et qui affiche une fenetre modal javascript avec le message d'erreur, ou dois-je appellé une servlet qui redirige vers une page d'erreur ou autre chose??

    Enfin je ne sais pas quoi trop faire de se coté pour que cela soit propre et bien pour l'utilisateur (lui réafficherla page avec les champs ou autres)

    Si quelqu'un pouvais m'eclairer, ce serais très sympa.
    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Personne ne peut m'aider?

  3. #3
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Ben je ne sais pas quels sont les objectifs exacts du TP, ce que tu as le droit d'utiliser et le temps que tu as mais pour la gestion des erreurs, je te recommandes de passer par le framework SPRING. Ce framework utilise une hierarchie de "SQLException" valable pour tous les SGBDR. Il sait donc encapsuler dans ces exceptions tous les codes d'erreur des SGBDR.
    Pour les proc stockéees, on n'en fait en général pas dans la "vraie vie". On les réserve à des cas particuliers où les performances sont critiques. On préféère faire une couche objet au dessus du SGBDR.
    Pour faire cette couche, tu as aussi une API très simple dans SPRING pour t'aider

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Pour le pooling de connexion, sache que l'interet est justement de ne l'initialiser qu'une seule fois. Ensuite tu stockes ton objet DataSource quelque part ou tu pourras le récupérer. En temps normal c'est dans le jndi mais vu que tu ne sais probablement pas ce que c'est tu peux le stocker en statique dans une classe utilitaire quelconque avec une méthode getDataSource() statique pour le récupérer.
    Ensuite je te déconseille fortement de faire des classes alambiquées pour gérer tes connexions sgbd. J'ai déja vu une foule de codes complétement pourris par ce genre de procédés (types mal castés, gestion des transactions déplorables,...). A moins d'utiliser un framework ultra-super-giga pro et pensé par des gens bien plus calé que toi et moi (genre Hibernate) mieux vaut se contenter du jdbc normal.
    Au fait, il n'y a pas 36 facons de faire une requete jdbc, il n'y en a même qu'une:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          java.sql.Connection conn=null;
          java.sql.PreparedStatement stmt=null;
          java.sql.ResultSet rs=null;
          try {
             conn = MyContext.getDataSource().getConnection();
             stmt = conn.prepareStatement("select * from clients");
             rs= stmt.executeQuerry();
          } finally {
             dbutils.DbUtils.closeQuietly(conn,stmt,rs);
          }
    Analysons ce code ensemble. Tout d'abord j'acquiert ma connexion depuis un datasource avec une méthode de ma classe utilitaire (c'est très important d'utiliser un datasource). Ensuite je place une clause finally dans laquelle j'utilise une méthode d'une autre classe utilitaire destinée à fermer tout les objets que je lui passe. L'utilisation systématique de ce bout de code permet de toujours fermer chaque objet de connexion que j'utilise de la facon la plus propre possible. La classe utilitaire DbUtils provient du package dbutils à propos duquel tu trouvera un tuto sur le site. Je te conseille vivement de lire ce tutoriel car son utilisation nous facilite beaucoup la vie (il permet aussi d'encapsuler tes données dans des beans, de charger tes requetes depuis un fichier properties,...).
    Pour finir, pour la gestion des erreurs en provenance de procédures stockées il n'y a pas grand chose sur le marché si tu veux faire un code portable. Tu peux toujours apprendre la gestion de exceptions utilisée par SQL Server ou faire tes propres classes.
    Perso j'ai imaginé un système qui n'utilise pas les codes d'erreur du sgbd (rien de moins portable) mais bien le texte renvoyé. Il compare ca avec des entrées dans un fichier properties avec une pincée d'expressions régulières puis au besoin instancie une nouvelle classe et construit un nouveau message d'erreur plus lisible.
    Voila, si j'ai pu t'aider...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2012, 10h50
  2. Erreur de liens avec une base SQL Server
    Par nbaxavf1 dans le forum Bases de données
    Réponses: 0
    Dernier message: 07/06/2011, 15h12
  3. Réponses: 9
    Dernier message: 19/06/2008, 12h19
  4. Connection à une base SQL Server 2005 avec ASP.NET en C#
    Par LaDeveloppeuse dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 10h29
  5. des dossiers dans une base sql server
    Par bimus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2006, 17h25

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