DataSource如何成为对ConnectionPoolDataSource的引用。

时间:2013-03-05 13:37:44

标签: java jdbc

获取连接的首选方法是通过我读过的DataSource。有DataSourceConnectionPoolDataSource等不同的界面。假设我们使用PostgreSQL驱动程序并希望在Glassfish服务器上使用连接池。

在您的应用程序代码中,您在getConnection()类型的属性上调用DataSource。这怎么可能?没有Glassfish创建类型为ConnectionPoolDataSource的数据源(或更正确的实现类)并将其绑定到JNDI名称,当您使用JNDI名称获取数据源时,您将获得ConnectionPoolDataSource的对象不是DataSource ?? ConnectionPoolDataSource没有getConnection()方法。我不明白这个服务器的魔力。

有人可以解释这一切是如何结合在一起的吗?

1 个答案:

答案 0 :(得分:4)

您可以在Glassfish配置中选择的DataSourceDriverConnectionPoolDataSource不会直接向您的应用程序公开,而是Application Server有自己的DataSource维护一个连接池,该数据源使用配置的DataSourceDriverConnectionPoolDataSource作为它将保留在其池中的连接的工厂。

因此,当您使用ConnectionPoolDataSource配置Glassfish时,它会使用ConnectionPoolDataSource为连接池创建物理连接(PooledConnection对象)。此连接池由应用程序服务器DataSource实现保留。然后,您的应用程序使用此DataSource访问该连接池。 DataSource从连接池中发出逻辑Connection对象。

逻辑和物理连接的确切内部工作依赖于实现,但这些逻辑连接通常是物理连接的某种代理或包装。获取逻辑连接后,将从连接池中检出物理连接。关闭逻辑连接时,连接池会收到物理连接再次可用的信号,并将其返回到连接池。