Aucun pilote approprié n'a été trouvé pour la connexion à la base de données Oracle

j'ai une petite Application Java, qui exécute tous les jours et vérifie les données dans la base de données en utilisant Cronj Schedular et tout fonctionne très bien, mais récemment j'ai observé que, il échoue en raison de

java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.110.xx.xxx:1521/test

en même temps, quand j'exécute mon code de test pour vérifier la connectivité de la base de données qui fonctionne bien sans les exceptions ci-dessus. Je ne suis pas en mesure de le comprendre. Bien que, il y avait juste un léger changement de code, mais qui n'était nulle part liée à la base de données ou la connexion de base de données. Quelqu'un, aidez - moi sur ce point ?

dbconf.java

public class dbconf {

    private Connection connect;
    private String connstr;

    public Connection getConnection() throws SQLException {
        connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";

        try {
                String uname = "scott";
                String pass = "tiger";
                Class.forName("oracle.jdbc.OracleDriver").newInstance();
                connect = DriverManager.getConnection(connstr, uname, pass);

        } catch (Exception e) {
            System.out.println(e.toString());
        }

            return connect;
    }
}

j'utilise ojdbc6.jar et Oracle11g

Édité - fichier de Journal d'Application

Wed Jul 01 09:25:17 IST 2015:------- Initializing -------------------
Wed Jul 01 09:25:17 IST 2015:------- Scheduling Jobs ----------------
Wed Jul 01 09:25:17 IST 2015:------- Job Started Running ----------------
Thu Jul 02 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.xxx.67.xxx:1521/test
Sat Jul 04 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
Sun Jul 05 06:00:00 IST 2015 : Job Executed..!! Bschedularv2.2
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@160.xxx.67.xxx:1521/test

Donc, vous pouvez le voir, il a échoué les 3 et 6 juillet. Mais, entre les deux il fonctionnait bien.

==mise à Jour de 1==

il semble, personne ne lit ma question correctement, j'ai clairement mentionné que, il est ça se présente bien un jour, mais un jour, ça échoue. Si c'était classpath problème, alors Il ne devrait pas avoir couru toute la journée.

===mise à Jour 2===

beaucoup de réponses ci-dessous étaient inutiles, mais peu avaient une vue logique. J'ai utilisé printStracktrace et essayé de déboguer chaque point et finalement j'ai obtenu un indice. 3 jours en arrière, j'ai déployé la nouvelle version d'application sur le même serveur (inclus printStackTrace et SysOut), les 2 premiers jours il a fonctionné très bien, aujourd'hui il a échoué avec erreur ci-dessous.

INFO: Illegal access: this web application instance has been stopped already.  Could not load com.schedular.job.BirthdayJob.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.quartz.simpl.LoadingLoaderClassLoadHelper.loadClass(LoadingLoaderClassLoadHelper.java:59)
    at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:99)
    at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:138)
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:852)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTrigger(JobStoreSupport.java:2816)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.execute(JobStoreSupport.java:2759)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.execute(JobStoreSupport.java:2757)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3787)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTriggers(JobStoreSupport.java:2756)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:272)

Jul 13, 2015 6:00:00 AM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load com.schedular.job.BirthdayJob.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.quartz.simpl.LoadingLoaderClassLoadHelper.loadClass(LoadingLoaderClassLoadHelper.java:59)
    at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:99)
    at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:138)
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:852)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1385)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2964)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.execute(JobStoreSupport.java:2908)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.execute(JobStoreSupport.java:2901)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3787)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggersFired(JobStoreSupport.java:2900)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:336)
14
demandé sur Ravi 2015-06-25 05:52:18

11 réponses

le format correct pour votre URL JDBC N'est pas ce que vous avez écrit:

connstr = "jdbc:oracle:thin:@160.110.xx.xxx: 1521 / test";

mais

connstr = "jdbc:oracle:thin:@//160.110.xx.xxx: 1521 / test";

ou

connstr = "jdbc:oracle:thin:@160.110.xx.xxx: 1521: test";

selon que "test" est un service ou d'un SID.



Le fragment de log que vous avez montré ne montre pas que la méthode getConnection a fonctionné le 4! Il a seulement montré qu'il n'y avait pas d'erreur jeté par elle. Cela signifie Peut-être simplement que la méthode n'a jamais été appelée (donc aucune connexion n'a été tentée).

0
répondu jwenting 2015-07-07 13:59:13

pas sûr que ça aide, mais c'est le code que je dois faire la même chose,

    try { 
        Class.forName("oracle.jdbc.driver.OracleDriver"); 
    } catch (ClassNotFoundException e) { 
        System.out.println("Could not load the driver"); 
    } 

    Connection conn = DriverManager.getConnection                                     ("jdbc:oracle:thin:@ten10:1521:acdb", user, pass); 

Donc, pas tout à fait la même Classe.forName, mais même forme pour le protocole.

la classe pour le nom est essentielle, elle garantit que le chargeur de classe a chargé le pilote Oracle jdbc.

ce qui pourrait se produire est un problème de connectivité sur la machine où le code est en cours d'exécution, de sorte que l'emplacement qui contient le ojdbc6 réel.jar (comme indiqué sur le classpath) est pas toujours accessible (si ce n'est pas sur un disque local ?).

0
répondu Yann TM 2015-07-07 14:23:33

il semble, le " ojdbc6.jar" n'est pas dans le chemin de classe de votre serveur d'application.

0
répondu sriharichander 2015-07-09 17:39:39

Quand il dit qu'il ne peut pas trouver la classe, il ne peut pas trouver la classe.

D'après mon expérience, ce genre de problèmes qui fonctionnent parfois et parfois ne sont pas liés au fil. Mon hypothèse, c'est ClassLoader charge votre classe async, donc appeler connection juste après le chargement peut être le problème. tu as essayé de charger la classe oracle dans une partie statique? quelque chose comme:

public class dbconf {

static {
  Class.forName("oracle.jdbc.OracleDriver");
}

public Connection getConnection() throws SQLException {
    String connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";
    try {
        String uname = "scott";
        String pass = "tiger";
        return DriverManager.getConnection(connstr, uname, pass);
    } catch (Exception e) {
        System.out.println(e.toString());
    }
}
}

autre problème: votre Code est-il compilé chaque jour(par livraison continue ou ...)?

0
répondu alizelzele 2015-07-10 11:03:36

il semble que le problème est avec votre pot essayer de remplacer par ojdbc14.bocal et ajouter à la Classe-chemin d'accès si vous utilisez Eclipse, suivez les étapes ci-dessous:- Eclipse -- > (sélectionnez le projet)allez à propriétés --> Java Build Path--> choisissez Ajouter Jar ou ajouter External Jar.

0
répondu Dharamendra Prajapati 2015-07-10 13:21:00

si possible, voir l'image pour DriverManager.getConnection () méthode. Il se peut que vous receviez un objet null connection DE LA PART DE DB, sans aucune exception, en cas de panne.

SQLException reason = null;
for(DriverInfo aDriver : registeredDrivers) {
    if(isDriverAllowed(aDriver.driver, callerCL)) {
        try {
            println("    trying " + aDriver.driver.getClass().getName());
            Connection con = aDriver.driver.connect(url, info);
            if (con != null) {
                println("getConnection returning " + aDriver.driver.getClass().getName());
                return (con);
            }
        } catch (SQLException ex) {
            if (reason == null) {
                reason = ex;
            }
        }

    } else {
        println("    skipping: " + aDriver.getClass().getName());
    }

}
if (reason != null)    {
    println("getConnection failed: " + reason);
    throw reason;
}
println("getConnection: no suitable driver found for "+ url);
throw new SQLException("No suitable driver found for "+ url, "08001");
0
répondu Amit Parashar 2015-07-11 17:52:25

une solution possible est la suivante : Allez dans le visualiseur D'événements -> Archives Windows et supprimez les événements D'Application et les événements système.(Ne supprimez pas les événements de sécurité!).Après cela, redémarrez votre pc et vous serez ok.

0
répondu grlouk 2015-07-12 11:16:07

Je ne suis pas familier avec" schedular " mais votre dernière mise à jour suggère que vous avez des fils qui n'ont pas été proprement arrêtés d'un undeploy/redeploy précédent. Il y a un JavaSpecialists bulletin d'information sur la façon d'arrêter les threads proprement.

je me demande si peut-être votre code d'arrêt de servlet désactive le pilote de la base de données? On dirait que vous courez dans Tomcat. Même si votre code ne désinscrit pas directement le pilote, Je crois que Tomcat 7 et plus va désinscrire les pilotes dans le cadre de la détection/atténuation des fuites de mémoire de Tomcat.

Qui pourrait expliquer pourquoi le pilote est parfois présent et parfois pas.

0
répondu Ryan 2015-07-16 17:58:51

Ne gardez pas le nom du pilote en mode statique. Utilisez L'API JDBC + Java pour obtenir le nom de la classe du pilote comme suit:

public class dbconf {

    private Connection connect;
    private String connstr;

    public Connection getConnection() throws SQLException {
        connstr = "jdbc:oracle:thin:@160.110.xx.xxx:1521/test";

        try {
                String uname = "scott";
                String pass = "tiger";
                Class.forName(OracleDriver.class.getClass().getName().toString()).newInstance();
                connect = DriverManager.getConnection(connstr, uname, pass);

        } catch (Exception e) {
            System.out.println(e.toString());
        }

            return connect;
    }
}

il est préférable, si vous avez fait une faute de frappe et vous pouvez vérifier si le ojdbc6.jar est placé dans le chemin de construction d'une bonne manière..

J'espère que cette information vous aidera...

0
répondu Ram72119 2015-08-27 07:01:26

comme quelqu'un s'est approché de moi pour la solution de cette question. Je poste maintenant.

  1. Je n'ai pas déployé l'application, qui avait ce problème et nettoyé tous les fichiers connexes du serveur.
  2. puis, j'ai redémarré le serveur tomcat. Ainsi, il va vider tous les fichiers temporaires et la cache.
  3. puis, j'ai déployé la même application et elle a commencé à fonctionner sans problème.
0
répondu Ravi 2017-06-17 14:33:41

l'erreur signifie que le pilote que vous utilisez n'accepte pas L'URL de connexion. Il semble que votre URL utilise la syntaxe MySQL (nom de la base de données séparé par '/'). Essayez D'utiliser la définition spécifique D'Oracle: jdbc:oracle:thin:@160.110.xx.xxx: 1521: test

-2
répondu Stan 2015-07-07 13:51:23