【问题标题】:Best structure for connection pooling with Java EE使用 Java EE 进行连接池的最佳结构
【发布时间】:2013-09-15 21:39:41
【问题描述】:

我正在尝试找出连接池的最佳结构,以便我可以从任何 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 发送获取请求时才分发连接。如果我想要另一个需要访问数据库的 servlet 怎么办。我正在考虑仅删除此 servlet 中的 doGet 和 doPost 方法并保留 init 以便在运行时初始化连接池,然后对该 servlet 有一个可用于其他 servlet 的单例引用。但是,这对我来说似乎不是正确的方法。构建可以从所有 servlet 和侦听器访问的连接池的最佳方法是什么?

感谢您的帮助!

【问题讨论】:

  • 您正在从数据源(它是连接池的接口)获取连接。 DataSource 是从 JNDI 获得的。如果您在 webapp 的任何其他类中使用相同的代码,则 DataSource 将是相同的:所有类将因此从同一个 DataSource 获得连接,在 JNDI 中注册。

标签: java jsp jakarta-ee servlets connection


【解决方案1】:

完全错误。

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

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

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

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

【讨论】:

  • 肯定会,不会。为什么要为非池化数据源烦恼?
  • 不属于 servlet,IMO。
  • 好的,你说的是合适的架构,而不是 OP 在init() 中检索它的方式。
  • 是的,我认为这是错误的。这对我来说似乎不合适。感谢您为我澄清这一点!所以我可能会像 Kevin Bowersox 所说的那样做,并且只需要一个课程来获得连接。这现在更有意义了!谢谢!
  • 将此代码保留在 servlet 之外的一大好处是,DAO 可以是 POJO,您可以在不需要 servlet 引擎的情况下对其进行测试。
【解决方案2】:

创建连接的逻辑可以放在一个简单的类中。

public class ConnectionManager{
       public static Connection getConnection(){
        Connection connection = null;
        try {
            // Get DataSource
            Context initContext  = new InitialContext();
            Context envContext  = (Context)initContext.lookup("java:/comp/env");
            dataSource = (DataSource)envContext.lookup("jdbc/test");
            connection = dataSource.getConnection();
        } catch (NamingException e) {
            e.printStackTrace();
        }

       if(connection == null){
           throw new RuntimeException("Cannot connect");
       }

       return connection;
       }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2014-10-19
    • 2016-05-19
    • 2012-10-19
    • 2011-07-04
    • 2013-01-06
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多