Je crée une connexion à une base de données dans un projet Web en Java. Cependant, une chose que j'ai confondue;Création et fermeture de la connexion à la base de données dans ServletContextListener vs Filter
- Quelle est la meilleure façon de créer des connexions de base de données et de fermer la connexion? En utilisant
Filter
ouServletContextListener
? - Une fois que j'effectue l'opération de base de données dans une servlet, comment se fermera la connexion JDBC? Ai-je besoin de fermer la connexion manuellement? Où dois-je fermer la connexion? J'ai ajouté la méthode
contextDestroyed
pour fermer la connexion, mais je pense que cela ne fonctionnera que lorsque le serveur Tomcat sera arrêté. Ou dois-je ouvrir et fermer la connexion dansFilter
?
Voici les étapes comment je travaille
- Créer un
DataSource
dans le fichier de serveur TomcatContext.xml
en utilisant<resource>
tag - référence à la ressource dans le
web.xml
en utilisant la balise<resource-ref>
- Créer la connexion dans le
contextInitialized
duServletContextListener
- Faire la base de données o pération dans le servlet de
doPost
oudoGet
méthodes
méthode contextInitialized
:
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("START CONNECTION");
try {
Context contextEnvironment = (Context) new InitialContext().lookup("java:comp/env/");
DataSource ds = (DataSource) contextEnvironment.lookup("jdbc/lunaruniversity");
try {
Connection con = ds.getConnection();
ServletContext context = event.getServletContext();
context.setAttribute("dbConnection", con);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
méthode de servlet doGet
:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection con = (Connection) getServletContext().getAttribute("dbConnection");
String saveStudent = request.getParameter("saveStudent");
String insertSQL = "INSERT INTO STUDENT (FNAME, LNAME, EMAIL, PHONE, STATE, ZIPCODE) VALUES(?,?,?,?,?,?)";
String fName = request.getParameter("fName");
String lName = request.getParameter("lName");
String email = request.getParameter("email");
String phone = request.getParameter("phone");
String state = request.getParameter("state");
String zipCode = request.getParameter("zipCode");
try {
java.sql.PreparedStatement ps = con.prepareStatement(insertSQL);
ps.setString(1, fName);
ps.setString(2, lName);
ps.setString(3, email);
ps.setString(4, phone);
ps.setString(5, state);
ps.setString(6, zipCode);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
méthode contextDestroyed
:
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("CLOSE CONNECTION");
DataSource ds = (DataSource) event.getServletContext().getAttribute("dbConnection");
try {
if (!ds.getConnection().isClosed()) {
System.out.println("CONNECTION IS CLOSED");
ds.getConnection().close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Vous pouvez placer le try-with-resources dans un 'Filter' (# 3). De cette façon, vous pouvez ajouter automatiquement le code de gestion des exceptions 'rollback()' si une exception se produit, et vous pouvez également y exécuter une logique d'installation de connexion standard, par ex. 'setAutoCommit (false)'. Seul inconvénient est que la connexion est prise du pool, même pour les appels de servlet qui n'en ont pas besoin. Toujours, +1 de moi. – Andreas
Avez-vous de meilleurs liens auxquels je peux me référer? Merci ! – greencheese
@greencheese Liens vers quoi? Comment utiliser try-with-resources? Avez-vous essayé [Google] (https://www.google.com/search?q=try-with-resources)? – Andreas