Servlets - Utilisation correcte ?

Servlets - Utilisation correcte ? - Java - Programmation

Marsh Posté le 19-10-2009 à 16:31:49    

:hello:  
 
J'ai fait un essai avec ajax (une aide à la recherche, à la google style), qui va lire des enregistrement dans Oracle.
 
Donc à chaque frappe du clavier --> Un select executé.
 
J'aimerai vos avis sur plusieurs points :
- Est-ce que je gère bien les connexions/déconnexions ?
- Est-ce que ce code est correct au point de vue performances ?
- Que changeriez vous ?
 
Je cherche surtout à faire du code propre et performant, et je vous rassure, ce n'est pas un exercice à terminer pour un cours quelconque ;-)
 

Code :
  1. package lu.dinow.ajax;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.sql.*;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9. public class StudentInfo extends javax.servlet.http.HttpServlet  {
  10. private Connection orclCon;
  11. public void doGet(HttpServletRequest req, HttpServletResponse res)
  12.     throws IOException, ServletException {
  13.  System.out.println("doGet" );
  14.  res.setContentType("text/xml" );
  15.  PrintWriter out = res.getWriter();
  16.  String ret = process(req,req.getSession());
  17.  out.print(ret);
  18.  out.close();
  19. }
  20. public void init() throws ServletException {
  21.  super.init();
  22.  try {
  23.   orclCon = connect();
  24.  } catch(ClassNotFoundException e) {
  25.   e.printStackTrace();
  26.  } catch(SQLException e) {
  27.   e.printStackTrace();
  28.  }
  29. }
  30. private String process(HttpServletRequest res, HttpSession session){
  31.  String ret = "";
  32.  try{
  33.   ret = "<root>";
  34.   String typedLetters = res.getParameter("roll" );
  35.   Connection con = (orclCon == null) ? connect() : orclCon;
  36.   Statement stmt = con.createStatement();
  37.   String query = "Select First_name from employees where lower(first_name) like lower('" + typedLetters +"%') order by First_name";
  38.   ResultSet rs = stmt.executeQuery(query);
  39.   int i = 0;
  40.   while(rs.next()){
  41.    ret +="<employee id='"+ (i++) +"'>"+rs.getString("First_name" )+"</employee>";
  42.   }
  43.   rs.close();
  44.   stmt.close();
  45.   ret +="</root>";
  46.  }catch(Exception ex){
  47.   System.out.println(ex.getMessage());
  48.  }
  49.  return  ret;
  50. }
  51. public void destroy() {
  52.  super.destroy();
  53.  if (orclCon != null){
  54.   try {
  55.    System.out.println("Disconnected from Oracle" );
  56.    orclCon.close();
  57.   } catch(SQLException e) {
  58.    e.printStackTrace();
  59.   }
  60.  }
  61. }
  62. private Connection connect() throws ClassNotFoundException, SQLException {
  63.    System.out.println("Attempt to connect to Oracle..." );
  64.    String driverName = "oracle.jdbc.driver.OracleDriver";
  65.    Class.forName(driverName);
  66.    String url = "jdbc:oracle:thin:@EMEALU6CZ5J2J:1521:ORCL";
  67.    return DriverManager.getConnection(url, "HR", "HR" );
  68. }
  69. public void doPost(HttpServletRequest req, HttpServletResponse res)
  70.     throws IOException, ServletException {
  71.  System.out.println("doPost" );
  72.  res.setContentType("text/xml" );
  73.  PrintWriter out = res.getWriter();
  74.  String ret = process(req, req.getSession());
  75.  out.print(ret);
  76.  out.close();
  77. }
  78. }


Message édité par didier1809 le 19-10-2009 à 16:35:22

---------------
.
Reply

Marsh Posté le 19-10-2009 à 16:31:49   

Reply

Marsh Posté le 19-10-2009 à 16:46:10    

tu ferais pas mieux de passer par un pool de connexion? surtout pour ce genre de cas (auto completion en ajax) si t'as 10 gus en train de taper dans le champ, ca fait tout de suite une foultitude de requêtes et donc d'ouverture de connexions en un rien de temps...
 
et sinon pense à blinder ton code contre les injections sql, car la on peux lui faire renvoyer un peu n'importe quoi...

Reply

Marsh Posté le 19-10-2009 à 16:50:08    

Merci :)
 
Pour le pool de connexions, je fais comment en pratique ?
 
Je "met" ca dans le contexte de tomcat ou quoi ?
 
Pour blinder le code je vais y regarder oui
 
Edit:
Protection contre l'injection de code :

Code :
  1. String selectStatement = "Select First_name, Last_name from employees where lower(first_name) like ? order by First_name";
  2.   PreparedStatement prepStmt = conn.prepareStatement(selectStatement);
  3.   prepStmt.setString(1, (typedLetters+"%" ).toLowerCase());
  4.   ResultSet rs = prepStmt.executeQuery();


 
 
Connection pool:
 
J'ai piqué le code ici : http://www.kgo.de/Pool.html


Message édité par didier1809 le 19-10-2009 à 17:03:25

---------------
.
Reply

Marsh Posté le 22-10-2009 à 08:34:46    

CdE a écrit :

Mets un timer dans ton champs pour l'ajax aussi (genre au moins 500ms sans modification avant de faire la requête) ça t'évitera de manger 200 requêtes pendant que le mec tape.


 
Ok, oui bonne idée, tu as un exemple ?


---------------
.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed