Olá pessoal,
Estou iniciando no desenvolvimento com servlets, e fiquei com algumas dúvidas se minha implementação é segura e eficiente.
A princípio em meus testes está funcionando, mas não sei em um
ambiente com muitos usuários concorrentes se haveria algum problema.
Criei um filter p/ retornar uma conexão do Pool de conexões e
instanciar um objeto da classe Env que guardará alguns
parâmetros recebidos através da URL, os quais eu guardo
através de
request.setAttribute(“con”, con);
request.setAttribute(“env”, env);
Depois recupero a conexão e o objeto dentro do servlet
através de
Connection con = (Connection)request.getAttribute(“con”);
Env env = (Env)request.getAttribute(“env”);
public final class DBConnectionFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Connection con = null;
try {
// Retorna uma conexão do Pool de conexões
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mydatabase");
con = ds.getConnection();
// Armazena a conexão p/ ser utilizada posteriormente pelo servlet
request.setAttribute("con", con);
// Captura e armazena parâmetros comuns recebidos através da URL
Env env = new Env();
env.setUsr(request.getParameter("usr"));
env.setPwd(request.getParameter("pwd"));
// Armazena objeto Env p/ ser utilizado posteriormente pelo servlet
request.setAttribute("env", env);
chain.doFilter(request, response);
} catch (Exception e) {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.println("Erro ao conectar a base de dados.");
} finally {
// Garante o fechamento da conexão para retorno
// desta ao Pool de conexões
try {
if (con != null)
con.close();
} catch (SQLException ignored) {
}
}
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
}
public class MyServlet extends HttpServlet implements Servlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// Recupera os objetos con e env armazenados pelo DBConnectionFilter
Connection con = (Connection)request.getAttribute("con");
Env env = (Env)request.getAttribute("env");
// Restante do código...
} catch (Exception e) {
e.printStackTrace();
}
}
}
Haveria algum problema nesta implementação, no caso
de vários usuários acessando um mesmo servlet ao
mesmo tempo ?
Grato pela colaboração,
Douglas