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