【问题标题】:Setup Connection pooling in jsp/servlets application based on MVC?在基于 MVC 的 jsp/servlets 应用程序中设置连接池?
【发布时间】:2012-04-23 16:30:28
【问题描述】:

我想在我的 Java Web 应用程序中使用 MySQL 和 JDBC 连接池,我在 Apache Tomcat 6.0 (6.0.35) - JNDI Datasource HOW-TO 找到了一个非常值得学习的资源, 但是这个例子使用 JSTL 代码来解释如何从池中检索连接。我想以类似的方式工作,但从头开始使用由 Bean、DAO、Servlet 和 JSP 组成的 MVC 架构。我从 BalusC 的一个非常好的 DAO tutorial 中得到了我想要的一切,但我在教程的最后一部分说 How about Connection Pooling? 感到困惑。谁能详细说明这个连接池主题和close() 方法?

编辑:
其实我也应该早点添加这个东西:
由于我上面链接的教程出现在 JDK7 之前,它现在具有自动关闭 Connection 的 try-wth-resource 代码,那么我们如何使用相同的 DAO 代码维护连接池并在此处关闭池中的连接 (或稍作改动) 与教程中的一样?

【问题讨论】:

    标签: java model-view-controller jakarta-ee connection-pooling java-7


    【解决方案1】:

    如果您的应用程序需要由多个用户使用,则一个connection 可以由connection pool 持有,因此其中几个用户将重用现有的connection 而不是创建新的connection,这将消耗时间。 关于close()方法:连接池保持活动状态,如果每次访问后不关闭与它的连接,连接会堆积,如果数量增加,连接池会堵塞,不再接受其他连接!

    public class MyDao {
    
        private InitialContext context;
        private DataSource datasource;
    
        public MyDao() {
    
            try {
    
                Class.forName("com.mysql.jdbc.Driver");
                Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
                context = new InitialContext();
                datasource = (DataSource) context.lookup("datasource name");
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
    
        }
     public MyBean getMyBean() throws SQLException {
            Connection connection = null;
            PreparedStatement statement = null;
            ResultSet res = null;
    
            String sql = "some query";
            try {
                connection = datasource.getConnection();//pool connection
                statement = connection.prepareStatement(sql);
                res = statement.executeQuery();
                while (res.next()) {
                   //return true
    
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
    
         finally {
                if (rs!= null) try { rs.close(); } catch (SQLException logOrIgnore) {}//result set if any
                if (stm!= null) try { stm.close(); } catch (SQLException logOrIgnore) {}//clase statement if any
                if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}//close connection
                }
                }
    
    
    }//close MyDao
    

    【讨论】:

    • 能否为教程中close()方法中提供的伪代码推荐一个代码?
    • 我已经编辑了我的答案,希望对您有所帮助。在@BalusC 的教程link 中,我看到连接在DAO 实用程序类 中关闭
    • DataSourceConnection#getConnection() 方法我已经很清楚了,我也在使用它们,但我的问题是 close() 方法,在教程中 close() 方法是用于关闭连接、ResultSet 和 Statement 对象,但我想在 Connection Pooling...What will be the the _updated_ close()` 的基础上重写连接池?
    • 您不会关闭池本身,但如果它们不使用,则会在其中建立池连接......据我所知。教程里说得很清楚。
    • 是的,你说得对,这让我感到困惑——如果它们不使用,请关闭其中建立的池连接,这是伪解释的事情教程中的代码,但我不能自己制作真正的代码。 . . :(
    猜你喜欢
    • 2012-05-11
    • 2023-03-20
    • 2020-02-09
    • 1970-01-01
    • 2014-01-10
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多