刘小爱v 自己写一个数据库连接池?,如何使用动态代理( 二 )


任何数据库要连接Java就得实现Connection接口 。
②MySQL中的close方法
我们使用的数据库是MySQL , MySQL它本身也确实实现了Java中的Connection接口(ConnectionImpl这个类)
也就是MySQL官网上下载的驱动 , 导入架包直接可以用 。
至于其close方法具体是如何写的 , 我们不用管 。
好现在我们弄明白了close方法到底是个什么回事 , 要改造close方法 。
要知道Connection中是有很多很多方法的 , 并不是只有一个close方法 。
在我们所学的知识中 , 有什么方法可以实现该目的?
继承就可以了:自定义一个类MyConn , 继承MySQL中的ConnectionImpl类 , 只重写close方法 , 其它方法都不管 。
既然有继承 , 那装饰设计模式也可以 。
并且装饰设计模式比继承更有拓展性 。
自定义一个类MyConn实现Java中的Connection接口:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①构造方法
我们要将close方法改造成将连接还回连接池 , 肯定要传进来一个我们正在使用的连接池 。
此外还需要一个连接 , 根据面向接口编程原则:
参数设置成Java中的父接口Connection 。
具体传参时 , 用mysql写的实现类连接也行 , 用oracle写的实现类连接也行 。
②改造close方法
释放资源时会有一个这样的操作:coon.close() 。
它本来的所有是将连接conn销毁掉 , 但我们现在不销毁而是要将其重写放回到连接池中 。
所以具体的业务逻辑就是:pool.addLast(this) 。
这个this就是指的coon , 谁调用了close方法 , 这里的this指的就是谁 。
③其它方法不改造
mysql中的连接是如何处理的 , 我们直接调用就好了 。
所以其它方法都没有具体的业务逻辑 , 而是直接让传进来来的conn去处理 。
其它方法是有很多个的 , 我随便截一个图:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
方法一大堆 , 这还仅仅只是一部分 , 还有很多 , 没法一下子截图下来 。
这个装饰设计模式也就类似于当初学动态代理说的明星与经纪人案例:
mysql中的连接 , 就相当于具体某个明星;
我自定义的连接类 , 就相当于该明星的经纪人 。
经纪人只做沟通 , 具体怎么操作还是要靠明星 。
自定义的连接类只修改close方法 , 其它还是要靠mysql中的连接 。
既然如何 , 那何不用动态代理?
三、优化二之动态代理
前面屁颠屁颠第说了这么一大堆 , 其实就是为了引出动态代理这个概念 。
因为动态代理比较难理解 , 所以一步一步说明 。
我们再做一个梳理:
首先Java中有一个连接接口Connection 。
其次MySQL中有一个连接类实现了Java中的这个接口 , 具体怎么实现的 , 我们不用管 。
最后我们要将MySQL连接中的close方法做一个改造 , 同时其它的方法都不用改变 。
也就是说我们需要去代理MySQL中的连接 。
现在使用动态代理进行改造:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①从连接池中获取连接
这个连接是什么?是MySQL中写好的实现类连接 。
②动态代理改造
三个参数:
conn的类加载器 。
被代理类所要实现的接口 , 也就是Java中的Connection接口 。
调用处理器 。
动态代理的核心其实就是这个调用处理器 。
后续connProxy调用close方法也好 , 调用其它方法也罢 , 其都会做一件事情:调用处理器调用invoke方法 。
③返回代理类连接对象
这个已经是改造好了的 , 也就是说我们从连接池中获取连接 , 本来是MySQL中的 , 但是我们现在将其改造了 。


推荐阅读