Mysql 传递jdbc数据源v/s传递连接对象-从servlet传递到java类

Mysql 传递jdbc数据源v/s传递连接对象-从servlet传递到java类,mysql,jakarta-ee,servlets,jdbc,connection-pooling,Mysql,Jakarta Ee,Servlets,Jdbc,Connection Pooling,我有一个处理post/get请求的主Servlet。 我正在使用连接池(jdbc/mysql和glassfish v3),我的servlet代码是: public class Controller extends HttpServlet { private DataSource datasource; @Override public void init() throws ServletException { super.init(); try { //Da

我有一个处理post/get请求的主Servlet。
我正在使用连接池(jdbc/mysql和glassfish v3),我的servlet代码是:

public class Controller extends HttpServlet {
private DataSource datasource;
@Override
public void init() throws ServletException {
      super.init();
     try {
        //Database Connection pooling:
        InitialContext ctx = new InitialContext();
        datasource = (DataSource)ctx.lookup("jdbc/MySQLPool");
      }
      catch (Exception e) {
         e.printStackTrace();
       }
   }
private Connection getConnection() throws SQLException {
    return datasource.getConnection();
    }
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    Connection connection=null;
    try {
            connection = datasource.getConnection();
            Object obj=  cmdFactory.getInstance().getCommand(Cmd).execute(connection);
        }
等等。。。在最后一个块的servlet末尾,我关闭了连接


因此,现在我将“connection”对象作为最后一行中的参数传递,以供其他(非servlet)java类通过应用程序的较低层使用。这是错的吗?传递datasource对象(然后在特定类中传递datasource.getConnection())是否更好?或者在其他java类中是否可以使用类似于“getServletContext().getAttr(数据库)”的东西来获取此连接?

数据源允许获取JDBC连接(大多数情况下是从连接池中获取)。在servlet环境中,如果两次请求数据源的连接,将得到两个不同的连接

因此,传递数据源没有意义:您希望调用链中的所有对象使用相同的连接,并在最后提交


必须使用从数据源获取连接的方法关闭连接,在finally块中,否则池将泄漏连接,并且您将很快耗尽可用连接。

非常感谢:)是的,关于泄漏,您完全正确,谢谢提醒我,因为我已经忘了它!一个问题:您如何估算或计算特定web应用的连接池大小?是否有类似的参考?这是我第一次使用连接池,我只是使用了glassfish的默认参数。这取决于并发用户的数量、数据库实际支持的连接数量以及线程池中的线程数量。你必须用预期的并发用户数对你的应用程序进行负载测试,看看最佳的并发用户数是多少。然后你必须验证现实是否符合你的期望。