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