数据库连接池铺垫(miniConnectionPoolManager用到的类)

萧晓博
2023-12-01

今天怀着试试的心态去了参加了长沙某龙智的校园宣讲会,结果就是一个坑货,讲来讲去就是自己所为的就业绿色通道,无非就是培训。废话少说,进入正题。

现在先来讲讲miniConnectionPoolManager中使用到的类抑或接口,其中涉及了一些平常比较少见的类(对我而说)。

miniConnectionPoolManager的实质:(其实这一段是PooledConnection在API中的一段描述而已)

连接池管理器(通常为应用程序服务器)维护 PooledConnection 对象的池。如果在池中存在可用的PooledConnection 对象,则连接池管理器返回作为到该物理连接的句柄的 Connection 对象。如果不存在可用的 PooledConnection 对象,则连接池管理器调用ConnectionPoolDataSource 方法 getPoolConnection 创建新的物理连接。实现 ConnectionPoolDataSource 的 JDBC 驱动程序创建新的 PooledConnection 对象并返回一个到它的句柄。 当应用程序关闭连接时,它调用 Connection 方法 close。完成连接池时,连接池管理器将得到通知;因为它曾使用 ConnectionPool 方法addConnectionEventListener 作为 ConnectionEventListener 对象注册它自身。连接池管理器释放到 PooledConnection 对象的句柄,并将 PooledConnection 对象返回到连接池,以便再次使用。因此,当应用程序关闭其连接时,基础物理连接会被回收而不是被关闭。在连接池管理器调用 PooledConnection 方法 close 之前,物理连接不会被关闭。调用此方法通常是为了按顺序关闭服务器,也可能在发生了严重错误,导致连接变得不可用时调用。

自己的话:这个是要澄清的一点,其实这个miniConnectionPoolManager这个数据库连接池,跟我之前想象的池中放置的连接是不一样的,之前一直以为放置的Connection,而实际上并不是,而是PooledConnection。而在这个连接池中,首先设置相应的连接数,而此时Semaphore则用于调控这个过程,而相应的监听器(PoolConnectionEventListenner)则是将断开的连接(Connection)的PooledConnection放置到集合中也就是所谓的数据库连接池。

PooledConnection  (详情可以参见JDK API)

为连接池管理提供钩子(hook) 的对象。PooledConnection 对象表示到数据源的物理连接。该连接在应用程序使用完后可以回收而不用关闭,从而减少了需要建立连接的次数。(可以回收而不用关闭,觉不觉得它就是为数据库连接池而生的啊~)

自己的话:其实就是说通过这个类可以获得Connection而在这个过程中对Connection,close()的时候这个类的连接不会被关闭,而是回收了,减少了连接的次数。这个时候有的童鞋可能会想,我们使用普通的jdbc而是拿到connection然后执行有关的操作,然后再进行关闭等,就是这个过程导致的时间等的问题。刚开始我也是这么想的,但是在API中有这么一句原话,应用程序员不直接使用 PooledConnection 接口,而是通过一个管理连接池的中间层基础设施使用。为什么作为一个中间基础设施呢,这个类的对象表示的是到数据源的物理连接,API中有这么一句原话,通过 DataSource 对象访问的驱动程序本身不会向 DriverManager 注册。通过查找操作获取 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。普通jdbc是通过DriverManager来获取连接(Connection)的,而这个类则不是,是通过DataSource,PoolConnection来或的连接(Connection)的,而此时这个类不用关闭就减少脸颊次数,而用jdbc的话,那么每一次获取一个连接(Connection)就要到DriverManeger中进行连接,登陆相应的数据库,这样下来这个损耗可是相当之大的。

ConnectionPoolDataSource

PooledConnection 对象的工厂。实现此接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) 的命名服务中注册。

自己的话:这个类和DataSource一样是实现了CommonDataSource这个接口的,所以DataSource的有关性质也就与它没有多大的区别了。

Semaphore

一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。

自己的话:信号量机制,比较直观的理解或许就是操作系统中死锁那里了,是为了并发条件下,多线程可能导致的死锁。而在这里我最直接的认识则是,PooledConnection的数目的控制,也就是API中所说的用于限制可以访问某些资源(物理或逻辑的)的线程数目,也可以查看http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

 

PoolConnectionEventListenner

是继承了ConnectionEventListener这个接口注册该对象便可获得由 PooledConnection 对象生成的事件的通知。

connectionClosed(ConnectionEvent event)

connectionErrorOccurred(ConnectionEvent event)

自己的话:这个类则是正对PooledConnection进行的操作,进行相应的操作,尤其是connectionClosed(event)这个操作在这里则是显得更重要,当Connection关闭的时候,则将相应的PooledConnection放到集合中去,供其他应用使用。

TimeoutExeceprion

自己的话:这个就不说了,就是一个异常而已。
 类似资料: