web-dev-qa-db-fra.com

javax.naming.NameNotFoundException: le nom [comp/env] n'est pas lié dans ce contexte. Impossible de trouver l'erreur [comp] avec le planificateur Java

Ce que j'essaie de faire est de mettre à jour ma base de données après un certain temps. J'utilise donc le planificateur Java et le regroupement de connexions. Je ne sais pas pourquoi mais mon code ne fonctionne qu'une fois. Il imprimera:

init success
success
javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:820)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:168)
    at org.Apache.naming.SelectorContext.lookup(SelectorContext.Java:158)
    at javax.naming.InitialContext.lookup(InitialContext.Java:411)
    at test.Pool.main(Pool.Java:25)  ---> line 25 is Context envContext = (Context)initialContext.lookup("Java:/comp/env");

Je ne sais pas pourquoi cela ne fonctionne qu'une fois. Je l'ai déjà testé si je ne l'ai pas exécuté sans planificateur Java et que tout fonctionne correctement. Aucune erreur, quelle qu'elle soit. Je ne sais pas pourquoi je reçois cette erreur si je l'exécute en utilisant le planificateur.

J'espère que quelqu'un pourra m'aider.

Mon code de pool de connexion :

public class Pool {
public DataSource main() {
    try {
        InitialContext initialContext = new InitialContext();
        Context envContext = (Context)initialContext.lookup("Java:/comp/env");
        DataSource datasource = new DataSource();   
        datasource = (DataSource)envContext.lookup("jdbc/test");
        return datasource;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

}

mon web.xml :

<web-app version="3.0" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
    <listener-class> package.test.Pool</listener-class>
</listener>
<resource-ref>
    <description>DB Connection Pooling</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Context.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<Context path="/project" reloadable="true">
  <Resource auth="Container" 
            defaultReadOnly="false" 
            driverClassName="com.mysql.jdbc.Driver" 
            factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory" 
            initialSize="0" 
            jdbcInterceptors="org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer" 
            jmxEnabled="true" 
            logAbandoned="true" 
            maxActive="300" maxIdle="50"
            maxWait="10000" 
            minEvictableIdleTimeMillis="300000"
            minIdle="30" 
            name="jdbc/test"
            password="test" 
            removeAbandoned="true"
            removeAbandonedTimeout="60" 
            testOnBorrow="true"
            testOnReturn="false" 
            testWhileIdle="true" 
            timeBetweenEvictionRunsMillis="30000"
            type="javax.sql.DataSource" 
            url="jdbc:mysql://localhost:3306/database?noAccessToProcedureBodies=true" 
            username="root"
            validationInterval="30000" 
            validationQuery="SELECT 1"/>
</Context>

mon ordonnanceur Java

public class Scheduler extends HttpServlet{

public void init() throws ServletException
{
    System.out.println("init success");
    try{
        Scheduling_test test = new Scheduling_test();
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(100);
        ScheduledFuture future = executor.scheduleWithFixedDelay(test, 1, 60 ,TimeUnit.SECONDS);
    }catch(Exception e){
         e.printStackTrace();
    }
}

}

Schedule_test

    public class Scheduling_test extends Thread implements Runnable{
    public void run(){
        Updating updating = new Updating();
        updating.run();
    }
}

mise à jour

public class Updating{

        public void run(){
            ResultSet rs = null;
            PreparedStatement  p = null;
            StringBuilder sb = new StringBuilder();
            Pool pool = new Pool();
            Connection con = null; 
            DataSource datasource = null;
            try{
                datasource = pool.main();
                con=datasource.getConnection();
                sb.append("SELECT * FROM database");
                p = con.prepareStatement(sb.toString());
                rs = p.executeQuery();
                rs.close();
                con.close();
                p.close();
                datasource.close();
                System.out.println("success");
         }catch (Exception e){
                e.printStackTrace();
         }
    }
6
Morgan Azhari

Cette erreur indique que votre ressource jdbc est non enregistrée ! Où avez-vous mis votre context.xml?

Le fichier context.xml doit se trouver dans le répertoire META-INF du fichier war. Il ne doit pas se trouver dans le répertoire classes ni dans un fichier jar .

Placez le répertoire META-INF avec le context.xml dans le répertoire contenant le répertoire root du webapp dans votre arborescence de dossiers source.

3
Heidarzadeh

J'ai eu le même problème qui a traîné pendant deux jours douloureux. J'ai relu la documentation de Tomcat sur JNDI, confirmé toutes mes configurations server.xml, context.xml, web.xml et le code permettant d'accéder à l'objet de dénomination ... toujours pas de progrès.

Il s’est avéré que la dépendance de mon projet interférait avec le contexte de nommage - axis2. Un simple déplacement d'axe2-1.6.0 à axe2-1.6.2 a causé mon problème.

1
Martins

Essayez d’arrêter et de redémarrer votre serveur (je suppose que vous utilisez Eclipse et un serveur Tomcat). Peut-être que lorsque vous avez créé votre fichier xml de contexte car il était vide à l'origine, votre serveur n'a pas été en mesure de synchroniser son contenu, d'où son incapacité à trouver le nom de la ressource de connexion à la base de données que vous avez spécifié ultérieurement dans le fichier context.xml.

c'est-à-dire si vous n'avez pas déjà résolu ce problème.

0
Onyekachi Akujua

Je viens de courir dans le même problème. Dans mon cas, mes fichiers de configuration Tomcat ou mon projet ne présentaient aucun inconvénient, mais je devais redémarrer mon instance de service postgres, car mon Tomcat était en cours d'exécution. Le changement serait alors pris en charge et l'exception disparaîtrait. J'ai dû redémarrer Windows pour que le problème disparaisse complètement. Aucune idée pourquoi!

0
Bat0u89

Ce n'est pas Java:/comp/env mais Java:comp/env.

0
taringamberini