背景分析
我们访问数据库时,需要通过TCP协议与数据库建立连接,连接使用完以后要释放连接,
TCP协议是一个面向连接的协议,而建立连接需要三次握手,释放连接需要四次挥手,这个
过程是比较耗时的,假如频繁访问数据库,每次都是直接与数据建立连接,会带来的很大
的性能问题,对于这样的问题如何解决呢?连接池诞生了.
什么连接池?
连接池是池化思想一种应用,基于享元模式做了落地的实现,就是在内存开辟一块区域,
存储创建好的连接,让这些连接可以得到重用,进而提高数据库的访问性能。
Java中连接池的实现?
在java中所有连接池的实现(c3p0,dbcp,druid,hikariCP,...)必须遵守java中的一个设计
规范,此规范为javax.sql.DataSource,通过这个规范获取连接池的具体实现,进而取到连接
,实现与数据库通讯.
1)Java中与数据库建立连接需要什么?数据库驱动
2)这个数据库驱动的设计需要遵守什么规范吗?JDBC
3)当我们通过JDBC API获取到一个连接以后,应用结束我们会将连接返回到池中吗?会
4)连接池在应用时有什么弊端吗?(会带来一定的内存开销,以空间换时间)
5)假如现在让你去设计一个连接池,你会考虑哪些问题?
5.1)存储结构 (数组->随机访问效率比较高,链表-适合随机插入和删除)
5.2)算法 (FIFO,FILO,.........)
5.3)线程安全 (锁-锁的粒度会影响性能和并发)
5.4)参数的设计(最多有多少连接,多余的连接什么时间被释放,.....)
Bug?
1.SqlException (Access denied for user --->访问被拒绝)
2.CommunicationException(通讯失败,检查数据库服务是否启动了)
3.'Url' attribute is not specified (url没有配置或配置错误)
4.Unknow Host 'dbgoods' (检查数据库中是否有dbgoods数据库)
SpringBoot 工程中基于HikariCP连接池实现一个JDBC业务
1).业务描述?(从数据库将商品信息查询出来并在测试类中做具体输出)
2).API设计?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
3).时序访问设计?(GoodsDaoTest-->GoodsDao-->DefaultGoodsDao-->DataSource-->HikariDataSource->HikariPool->Connection-->JDBC)
4)代码的具体落地实现?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
5)具体JDBC代码实现如下:
4.1)建立连接(从池中获取Connection对象)
4.2)创建Statement(基于此对象发送SQL)
4.3)发送SQL执行查询操作
4.4)处理查询结果,将结果存储List
1)数据元对象DataSource从哪里获取?(由Spring进行值的注入)
2)假如DataSource对象的值为null是什么原因?(是否有特性注解描述)
3)结果集映射时,Map中的key是谁?(字段名)
4)Map对象存储数据时,key相同,值会覆盖呢?会
5)HashMap对象中的key是有序的吗?(无序,不能保证添加的顺序)
6)资源释放时有什么规则吗?(先创建的后关闭)
7)你了解什么是元数据吗?(描述数据的数据,对于一张表而言元数据就是字段名)
8)构建JDBC应用时你使用的是规范还是规范的实现?(规范,Connection,Statement,ResultSet,...)
Bug?
1.SQLException?(SQL语法问题)
2.NullPointerException(空指针异常)