获取连接的首选方式是通过我所读到的数据源。有不同的接口(interface)如DataSource
和ConnectionPoolDataSource
。假设我们使用 PostgreSQL 驱动程序并希望在 Glassfish 服务器上使用连接池。
在您的应用程序代码中,您调用 getConnection()
在 DataSource
类型的属性上。这怎么可能? Glassfish 还没有创建 ConnectionPoolDataSource
类型的数据源吗? (或者更正确地说是实现类)并将其绑定(bind)到 JNDI 名称,当您使用 JNDI 名称获取数据源时,您将获得 ConnectionPoolDataSource
的对象不是DataSource
?? ConnectionPoolDataSource
没有 getConnection()
方法。我不明白这个服务器的魔力。
有人可以解释一下这一切是如何结合在一起的吗?
最佳答案
DataSource
, Driver
或ConnectionPoolDataSource
您可以在 Glassfish 配置中选择的数据不会直接暴露给您的应用程序,而是应用程序服务器有自己的 DataSource
来维护连接池,此数据源使用配置的 DataSource
、Driver
或 ConnectionPoolDataSource
作为将保留在其池中的连接的工厂。
因此,当您使用 ConnectionPoolDataSource
配置 Glassfish 时,它会使用 ConnectionPoolDataSource
为连接池创建物理连接(PooledConnection
对象)。此连接池由应用程序服务器 DataSource
实现保留。然后,您的应用程序使用此数据源访问该连接池。 DataSource 从连接池中分发逻辑 Connection
对象。
逻辑和物理连接的确切内部工作原理取决于实现,但这些逻辑连接通常是物理连接的某种代理或包装器。当获得逻辑连接时,会从连接池中 check out 物理连接。当关闭逻辑连接时,连接池会收到物理连接再次可用的信号,并将其返回到连接池。
关于java - DataSource 如何成为对 ConnectionPoolDataSource 的引用。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15225209/