java - Java EE 连接池的最佳结构

标签 java jsp jakarta-ee servlets connection

我正在尝试找出连接池的最佳结构,以便我可以从任何 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 和监听器访问的连接池的最佳方法是什么?

感谢您的帮助!

最佳答案

完全错了。

访问连接的正确方法是使用 JNDI connection pool .

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

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

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

关于java - Java EE 连接池的最佳结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18817763/

相关文章:

java - Neo4j 1.8.1 中 TraversalDescription.toJson 的替换

Java:运算符(operator)通知

jakarta-ee - Swagger 2.x JaxrsAnnotationScanner 找不到位于 ear 中的资源类

java - 在java中按负数移位

java - Tomcat 中的无响应线程

java - 无法在 Android 项目中使用 Eclipse 的剪贴簿

ajax - 在 AJAX 中使用 java bean

java - 电子邮件已使用 jsp 注册?

java - Spring 3 表单绑定(bind)对象始终为空

java - 设置/配置 EJB 定时器服务的数据源