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();
}
}
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.
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.
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.
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!
Ce n'est pas Java:/comp/env
mais Java:comp/env
.