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

今天是刘小爱自学Java的第68天 。
感谢你的观看 , 谢谢你 。
话不多说 , 开始今天的学习:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
在学线程的时候 , 学过线程池的概念 。
当时举了个地铁临时票的例子 , 来说明线程池的作用 。
其实数据库连接池也是一样的道理 。
也就是将数据库连接放到一个池子里面 , 需要使用时就去取 , 这样的话 , 就不用每次都自己获取连接了 。
用一张图片来说明:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①普通方式获取连接
用户每访问一次数据库就要获取一次连接 , 这样就会有几个问题:
连接使用完后就会被销毁 , 造成资源浪费 。
如果用户有很多个 , 要获取很多次连接 。
频繁的连接数据会造成资源消耗过多 , 从而使数据库死机 。
②连接池获取连接
连接池的好处在于:
每次使用完连接后将其放回连接池 , 资源重复利用 , 更能提高程序性能 。
无论多少个用户 , 都只需要从连接池中获取就可以了 。
一、自定义连接池
事实上关于连接池已经有框架将其封装好了 , 我们可以直接用 。 但现在是学习阶段 , 知其然也要知其所以然 。
我们不妨自定义一个连接池 , 看看具体是如何操作的 , 并且这样也能更好地去学习连接池框架 。
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①实现DataSource接口
dataSource是Java中的一个接口 , 也是Java制定的一个规范 , 不同的连接池都需要实现这个接口 。
MyDataSource是我们自定义的一个连接池 , 自然也是需要实现该接口 。
②创建连接池容器
为什么要用LindkedList?
连接池中的连接被取走 , 相当于删除了该连接 。
用户用完连接将其还回连接池 , 相当于增加了该连接 。
所以连接池要经常地进行增加和删除 。
LinkedList集合的底层是链表 , 特点增删快查询慢 , 所以选择使用LinkedList 。
③初始化连接池
也就是自定义连接池的构造方法 , 通过参数count可以指定连接池中连接的数量 。
④从连接池中获取连接
从连接池中拿走了一个连接 , 也就相当于将连接池中的该连接删除了 。
⑤用完将连接还回来
自定义一个backToPool()方法 。
使用完连接后调用该方法将连接还回来 。
这也就相当于将该连接添加进连接池中 。
自定义连接池写完 , 做一个测试:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①创建连接池
我们这边给连接池初始化6个连接 。
②获取连接
现在只需要从连接池中获取连接就好了 。
③预编译以及处理结果
这个昨天刚学习过 , 不再赘述 。
④释放资源
使用昨天封装在工具类JdbcUtil类中的release()方法 , 其中连接不需要被释放掉 , 用null代替 。
⑤连接还回
连接使用完了之后将其还回到连接池中 。
二、优化一之装饰模式
自定义连接池有一个问题 , 我们定义了一个方法backToPool() , 也就是将用完连接将其还回到连接池 。
对于我们开发者来说还得自己记住这个方法名 , 特繁琐 。
有没有什么方法直接就能达到其目的?
答案是有的 。 我们每次使用完连接都要close() , 也就是上述中被封装在工具类JdbcUtil类里的release()方法 。
将连接的close方法里面的业务逻辑改成将连接还会连接池就好了 。 我们看看close方法的源码:
刘小爱v 自己写一个数据库连接池?,如何使用动态代理
文章图片
①Java中的close方法
Java中有一个接口就是Connection接口 , 其中就有close方法 。 这个接口就是Java制定的一个数据库规范 。


推荐阅读