1 pièce(s) jointe(s)
Connexion à une BDD à l'aide de JNDI et try with resources
Bonjour,
je suis en train d'apprendre à me connecter à une base de données à l'aide d'un bouquin. On y présente plusieurs méthodes dont certaines marchent mais on préconise l'usage de JNDI.
J'ai recopié le code et adapté un peu à mon environnement. En gros c'est pareil sauf la chaine de connexion (il y a un cj en plus dans le nom de la classe à charger et le nom de la DB est différent) et la requête SQL effectuée.
Ce qui se passe c'est que je n'ai aucun retour d'erreur et aucune réaction. J'ai beau mettre des sorties sur la page ou la console, rien ne se passe ce qui suggère que l'on ne rentre pas dans le try with ressources qui initie l'objet Connection.
Je ne comprends pas pourquoi.
Je ne sais pas si mon code de traitement est plus ou moins correct mais ce qui me préoccupe dans un premier temps c'est bien cette connexion. Pourquoi rien ne se passe ? Le même Context.xml à été utilisé un peu plus tôt en fournissant un message à l'écran qui affiche connexion ouverte et qui renvoi le nom de la classe comme demandé. Donc pas d'erreur au niveau du Context.xml à priori. C'est configuré comme il faut.
J'ai aussi essayé de déboguer en lançant en mode débugger mais ça ne s'arrête pas à mes points d'arrêt. Comment on débogue une application Java EE ?
Je copie mon code du doGet() ici:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
String str = "Served at: "+request.getContextPath()+"\n";
out.append(str);
System.out.println(str);
response.setContentType("text/plain");
try {
Context context = new InitialContext();
String jndiName = "jdbc/pool_bookcollection" ;
DataSource dataSource = (DataSource)context.lookup("java:com/env/"+jndiName);
try (Connection cnx = dataSource.getConnection()){
System.out.println("DB USED: "+cnx.getCatalog());
System.out.println("Connexion "+(cnx.isClosed()?"fermée":"ouverte"));
out.println("Data Source: "+dataSource.getClass().getName());
// Traitement de requête pour plus tard
}
} catch (SQLException|NamingException e) {
e.getMessage();
} |
Voilà une copie d'écran de la console après avoir rafraîchi la page. Je n'y comprend plus rien. La "truc" d'affiche mais la ligne avec "DATASOURCE: " ne s'affiche pas... alors qu'ils sont dans le même bloc de code...
Si je déplace la dite ligne juste au dessus de
Code:
DataSource dataSource = (DataSource)context.lookup("java:com/env/"+jndiName);
alors elle s'affiche.
Pièce jointe 497651
Voilà le contenu du Context.xml:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/pool_bookcollection"
auth="Container"
type="javax.sql.DataSource"
maxTotal="100"
maxIdle="30"
maxWaitMillis="10000"
username="user"
password="************"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost/bookcollection"/>
</Context> |
Le serveur est TomCat v9.0
Merci.