一尘不染

使用Java EE进行连接池的最佳结构

jsp

我试图找出连接池的最佳结构,以便可以从任何servlet访问连接池并建立与数据库的连接。我一直在遵循一些教程来设置和配置数据源和连接池,它们都在扩展HttpServlet的类中进行了初始化和访问。所以看起来像这样:

public class DatabaseConnector extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private DataSource dataSource;
    private Connection connection;
    private Statement statement;

    public void init() throws ServletException {
        try {
            // Get DataSource
            Context initContext  = new InitialContext();
            Context envContext  = (Context)initContext.lookup("java:/comp/env");
            dataSource = (DataSource)envContext.lookup("jdbc/test");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#HttpServlet()
     */
    public DatabaseConnector() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet resultSet = null;
        try {
            // Get Connection and Statement
            connection = dataSource.getConnection();
            statement = connection.createStatement();
            String query = "SELECT * FROM STUDENT";
            resultSet = statement.executeQuery(query);
            while (resultSet.next()) {
                System.out.println(resultSet.getString(1) + resultSet.getString(2) + resultSet.getString(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (resultSet != null) {resultSet.close();}
                if (statement != null) {statement.close();}
                if (connection != null) {connection.close();}   
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

在我看来,此连接池仅适用于该servlet,它仅在向该servlet的URL发送get请求时才会分配连接。如果我想拥有另一个需要访问数据库的servlet怎么办?我正在考虑只删除该servlet中的doGet和doPost方法,并保留init以便在运行时初始化连接池,然后对这个servlet有一个单例引用,该引用可以在其他servlet中使用。但是,这对我来说似乎不是正确的方法。构造可从所有Servlet和侦听器访问的连接池的最佳方法是什么?

谢谢你的帮助!


阅读 333

收藏
2020-06-10

共1个答案

一尘不染

完全错误。

访问连接的正确方法是使用JNDI连接池

Servlet是HTTP侦听器。他们不应该与数据库有任何关系。

适当分层的Java EE解决方案会将数据源限制在服务层。它将检入和检出连接,了解工作和事务的单位,并与数据访问对象进行交互。

Servlet应该处理服务,而不是数据源。

2020-06-10