[JDBC]

[JDBC] - Programmation

Marsh Posté le 23-03-2001 à 11:11:15    

Si qqun aime bien débugger....
Lorsque l'appli quitte, java plante. Pour koi, mystère et.....
Et ce n'est pas la fermeture de la connexion à la base de données puisque je n'ai pas d'exception SQL à ce moment là. J'ai à nouveau le prompt DOS. C'est juste après que le message d'erreur apparaît...
 
JDK1.2, JRE1.3, NT4.0
 
LuLu,
 
import java.sql.*;
 
public class DB
{
 
  public static void main(String[] arg)
{
 Statement statementDB=null;
 Connection connectionDB=null;
        ResultSet rsRequete=null;
 // Chargement du driver JDBC
 try
 {
 Class.forName ("RmiJdbc.RJDriver" ).newInstance();
 }
 catch (Exception e)
 {
 System.err.println("Chargement du pilote JDBC impossible." );
 System.err.println(e);
 }
 
 // Etablissement de la connexion
 try
 {
 // URL d'accès à la base de données
 String url = "jdbc:odbc:Clients";
 
 // L'hote RMI est sur strAddressServer
 String rmiHost = new String("//BTW28617" );
        connectionDB = DriverManager.getConnection
        ("jdbc:rmi:"+ rmiHost + "/" + url);
 
 statementDB =connectionDB.createStatement();
 System.out.println ("Connexion a la base etablie\n" );
 }
 catch(SQLException e)
 {
 System.err.println("***** OpenConnection Exception SQL : *****\n" );
 while (e != null)
 {
 System.out.println("Message :" + e.getMessage ());
 System.out.println("Etat :" + e.getSQLState ());
 System.out.println("Code Erreur : " + e.getErrorCode () + "\n" );
 e = e.getNextException();
 }
}
 
 
 String strRequest = "SELECT Id_Forfait FROM Abonnes WHERE (Num_Abonne = 0612345678 AND Pwd_Abonne = 1234)";
 String fichier="";
 try {
  rsRequete=statementDB.executeQuery(strRequest);
     if(rsRequete.next())
  {
   fichier="/AAC/HTML/Accueil_Changement_Forfait.jsp?";
        fichier += "FORFAIT="+rsRequete.getInt("Id_Forfait" );
 fichier += "&NUM_ABO="+strNumTel;
  }
      }
 catch(SQLException e)
 {
 System.err.println("***** Exception SQL : *****\n" );
 while (e != null)
 {
 System.out.println("Message :"+e.getMessage ());
 System.out.println("Etat :"+e.getSQLState ());
 System.out.println("Code Erreur :" + e.getErrorCode () + "\n" );
 e = e.getNextException();
 }
 }
 System.out.println(fichier);
 try {
  rsRequete.close();
  statementDB.close();
  connectionDB.close();
  if(connectionDB.isClosed())
    System.out.println("Connexion a la base fermee\n" );
  }
 catch(SQLException e)
 {
 System.err.println("****** CloseConnection Exception SQL : *****\n" );
 while (e != null)
 {
  System.out.println("Message :     " + e.getMessage ());
  System.out.println("Etat :        " + e.getSQLState ());
 System.out.println("Code Erreur : " + e.getErrorCode () + "\n" );
 e = e.getNextException();
 }
 }
   }
}

Reply

Marsh Posté le 23-03-2001 à 11:11:15   

Reply

Marsh Posté le 23-03-2001 à 23:30:37    

A mon avis c la fermeture de la connexion à la base qui pose pb.
Le garbage collector libère la mémoire, pas les ressources externes.
 
Commence par créer une méthode pour nettoyer les ressources autres que la mémoire comme par exemple une connexion à une base de données.
 
public synchronized void libererRessources() throws SQLException
{
   if (connexion != null)
   {
      connexion.close();
      connexion = null;
   }
}
 
 
et redéfini la méthode finalize pour libérer les ressources externes avant l'objet.
 
protected void finalize() throws Throwable
{
   try  
   {
       libererRessources();
   }
   finally  
   {
       super.finalize();
   }
}

Reply

Marsh Posté le 27-03-2001 à 10:14:47    

C'est étonnant, car une simple ouverture/fermeture de la base ne provoque pas de plantage...

Reply

Marsh Posté le 28-03-2001 à 13:38:47    

tu as quoi exactement comme message d'erreur à la fermeture de l'appli (un message de tes catch ou une erreur de la JVM) ???
 
Sinon, es tu sur de ne pas masquer une exception dans tes try/catch ???  
Car si tu as par exemple un NullPointerException dans ton try et que tu traite seulement une exception de type SQLException dans ton catch, tu ne seras pas que l'exception NullPointerException a été levé. Pour tester remplace dans tes catch SQLException par
Exception en faisant un printStackTrace() pour voir l'état de la pile.

Reply

Marsh Posté le 28-03-2001 à 13:57:26    

C'est une erreur de la JVM : "l'instruction à "0x77b3cd19" emploie l'adresse mémoire "0x77b3cd19". La mémoire ne peut pas être read"....
Même en remplaçant tous les catch SQLException par des Exception rien ne sort à l'écran.
J'ai tout de même remarqué qu'en faisant un OpenConnection suivi d'un CloseConnection (sans faire de requêtes), les manips que je passe ensuite (qui plante habituellement l'appli) fonctionnent parfaitement.  
Pour l'instant, c'est donc faire une ouverture/fermeture de connexion à la base de données avant de passer à la suite. étrange, étrange...

Reply

Marsh Posté le 28-03-2001 à 15:58:16    

A priori, j'ai trouvé l'erreur....
Il semblerait lors de mes affectations qu'il faut employer le this...Pb d'instances des variables donc...
 
Par ex., au lieu de:
connectionDB = DriverManager.getConnection ("jdbc:rmi:"+ rmiHost + "/" + url);  
je fais : this.connectionDB = DriverManager.getConnection  
        ("jdbc:rmi:"+ rmiHost + "/" + url);  
 
et ainsi  pour chaque affectation/allocation....
 
et maintenant ça va...

Reply

Marsh Posté le 29-03-2001 à 08:51:52    

rectificatif....
Ce que j'ai fait hier n'a en fait rien changé...je me suis bluffé tout seul.
Il me semble avoir par contre localisé le pb.:la requête SQL:SELECT Id_Forfait FROM Abonnes WHERE (Num_Abonne = 0612345678 AND Pwd_Abonne = 1234)";  
 
lorsque j'enlève la clause WHERE, et bien ca ne plante plus...véridique
 
Lulu

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed