数据库连接池的用途?

5 java sql database connection-pooling

考虑一个简单的线程池。线程池的主要目的是重用(回收)线程以限制最大线程数并防止删除和创建线程,对吗?
最近我读到(维基百科连接池),在Java EE中,数据库连接由服务器池化,但我不明白为什么?
问题:

  • java中sql连接池的主要目的是什么?
  • 可以集中 128 个连接并保持所有连接打开吗?
  • 如果一个连接运行 128 个并发 select 命令,或者通过 128 个连接运行,有什么区别?
  • 通过连接池连接数据库的正确方法是什么?
  • 服务器和数据库如何处理连接?
  • 服务器如何重用已关闭的连接?
  • 当整个服务器组件使用共享连接时,池仍然是必要的吗?

提前致谢。

jin*_*dal 6

数据库连接池解决方案与您在这里提到的线程池非常相似。以下是主要原因。

  • 数据库连接池的主要目的是创建一些数据库连接并将它们保留在池中,并在应用程序代码需要对数据库执行查询时重用它们。由于创建连接是一项非常昂贵的操作,连接池使我们能够节省这项工作。
  • 创建 128 个连接并将它们保留在池中是完全可以的。
  • 一个连接上没有 128 个并发选择可能无法正常工作。通过连接池,您可以从池中获取连接,并使用它来触发操作所需的所有查询,然后将连接返回到池中。因此,您将需要 128 个连接来运行并发选择。
  • 通常,您让容器处理连接池。您可以在 web.xml 中配置连接池,或者在容器中指定配置文件,并将 JNDI 名称与连接到池的数据源相关联。然后,您查找该数据源并从那里获取连接。这是获取连接的示例代码。
public static Connection getConnection() {
        Connection con = null;
        try {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            DataSource dataSource = (DataSource) envContext.lookup("jdbc/db");
            con = dataSource.getConnection();
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
Run Code Online (Sandbox Code Playgroud)
  • 数据库将假设连接仍然处于活动状态,并且应用程序服务器有责任保持池中的连接处于活动状态(当然通过用户的配置)并避免连接超时。

  • 当你的应用程序代码通过调用connection.close()请求关闭连接时,这个连接并没有关闭,而是实际上返回到池中,以便进一步从池中请求连接将使用这个连接。

  • 对于所有 Web 应用程序,强烈建议您创建连接池,否则您将遇到与性能和打开的连接过多相关的问题。