背景剖析
咱们拜访数据库时,须要通过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<Map<String,Object>>
4.5)开释资源
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(空指针异样)