获取连接的首选方法是通过我读过的DataSource。有DataSource
和ConnectionPoolDataSource
等不同的界面。假设我们使用PostgreSQL驱动程序并希望在Glassfish服务器上使用连接池。
在您的应用程序代码中,您在getConnection()
类型的属性上调用DataSource
。这怎么可能?没有Glassfish创建类型为ConnectionPoolDataSource
的数据源(或更正确的实现类)并将其绑定到JNDI名称,当您使用JNDI名称获取数据源时,您将获得ConnectionPoolDataSource
的对象不是DataSource
?? ConnectionPoolDataSource
没有getConnection()
方法。我不明白这个服务器的魔力。
有人可以解释这一切是如何结合在一起的吗?
答案 0 :(得分:4)
您可以在Glassfish配置中选择的DataSource
,Driver
或ConnectionPoolDataSource
不会直接向您的应用程序公开,而是Application Server有自己的DataSource
维护一个连接池,该数据源使用配置的DataSource
,Driver
或ConnectionPoolDataSource
作为它将保留在其池中的连接的工厂。
因此,当您使用ConnectionPoolDataSource
配置Glassfish时,它会使用ConnectionPoolDataSource
为连接池创建物理连接(PooledConnection
对象)。此连接池由应用程序服务器DataSource
实现保留。然后,您的应用程序使用此DataSource
访问该连接池。 DataSource从连接池中发出逻辑Connection
对象。
逻辑和物理连接的确切内部工作依赖于实现,但这些逻辑连接通常是物理连接的某种代理或包装。获取逻辑连接后,将从连接池中检出物理连接。关闭逻辑连接时,连接池会收到物理连接再次可用的信号,并将其返回到连接池。