Servlet - DataSource连接的可变范围最佳实践

时间:2016-06-16 15:33:45

标签: java servlets scope datasource

我开发了一个servlet来根据客户端证书对用户进行身份验证。 但是,我在类定义中放置了一些变量,因此它们在会话之间共享,从而犯了一个错误。 我应该将它们放入doGet方法中。

现在,我想获得有关DataSource最佳实践的建议。 我在类中声明了InitialContext和Datasource,并在init方法中初始化它们。 我在doGet中声明了Connection,我在那里执行ds.getConnection。 我的以下代码是否正确?

提前致谢。

public class readclientcertificate extends HttpServlet {

    private static final String CONTENT_TYPE = "text/html; charset=windows-1252";
    // moved in doGet private X509Certificate cert;
    // moved in doGet private String strUUID = "";
    // moved in doGet private String strFormsURL = "";
    private InitialContext ic;
    private DataSource ds = null;       

    public void init(ServletConfig config) throws ServletException, NamingException {
        super.init(config);
        ic = new InitialContext();
        ds = (DataSource)ic.lookup("jdbc/OracleCoreDS");        
    }

    public void doGet(HttpServletRequest request, 
                      HttpServletResponse response) throws ServletException, IOException {

        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();               
        X509Certificate cert = null;
        String strUUID = "";
        String strFormsURL = "";        
        Connection conn = null;
        // Retreive Certificate
        try{        
            X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
            cert = certs[0];                    
        } catch(Exception e){
          out.println(e.getMessage());
        }

        // Connect to DB and Insert Certificate Informations.
        if (cert != null) {
            try {

               conn = ds.getConnection();           
               Statement stmt = conn.createStatement();
               ResultSet rs = stmt.executeQuery("select K$LOGON.FA_ADD_CERTIFICATE('" + cert.getSerialNumber() + "','" + cert.getSubjectDN() + "','" + request.getRemoteAddr() + "','" + request.getRemoteHost() + "','"  + request.getRequestURL() + "','" +strFormsURL + "') from dual");
               while (rs.next()) {
                strUUID = rs.getString(1);
               }
               conn.close();

            } catch (SQLException se) {
               throw new ServletException(se);
            } catch (NamingException ne) {
               throw new ServletException(ne);
            }      
        }

1 个答案:

答案 0 :(得分:0)

没关系,数据源由应用服务器处理。所以jndi键只有一个数据源实例,你可以共享数据源实例......不是连接实例