一、数据源
概念:存储所有建立数据库连接的信息
二、连接池
概念:分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
作用:资源重用;更快的系统反应速度;新的资源分配手段;统一的连接管理,避免数据库连接泄露
三、数据源和连接池的关系
数据源是连接的抽象, 存放数据库连接的信息,创建连接; 而连接池中存放的是具体的连接, 并负责对具体连接的管理; 所以数据源就可以使用连接池来池化连接.
四、连接
概念:执行sql语句并获取执行结果
五、功能扩展
1. 读写分离
方法一: 分开配置读写数据源, 业务控制选择使用哪一个
方法二:封装数据源, 配置读写分离规则, 分析语法树, 结合事务选择读库还是写库
2. 分库分表
方法一: 业务系统控制
方法二.:封装数据源, 将分库规则埋在ThreadLocal中,在获取连接前, 先从当前线程中取出对应的分库规则, 然后获取对应的数据源, 进而获取对应的连接
方法三: 封装数据源, 配置分库分表规则, 分析sql语法树,再结合分库分表规则选择连接及替换表名。
3. 日志监控
涉及到sql相关的日志和监控统一封装到数据源中来做, 既能减少漏记错记的情况发生, 调整的时候又不会对业务代码带来改动
六、 数据源的配置
1. tomcat-jdbc: http://mp.weixin.qq.com/s/FtAceKACWiFwwF8HfnQmwQ
结论:
数据库有效性监测推荐使用testOnBorrow(被别它的名字迷惑, 并不是每次都监测, 还要判断validationinterval
使用Druid的时候无需配置testOnBorrow(它能做到根据执行SQL异常(异常类型,error code)然后判断连接是否失效,如果失效了就移除,那也是可以自动恢复的,而不用特意的再执行额外的有效性检查),不过因为idle的时候没有SQL执行,所以建议配置一个testWhileIdle
2. 不同类型数据源有效性检查: http://mp.weixin.qq.com/s/vMiJWY5IoWfeWASODqTz9Q
结论:
tomcat-jdbc: 提供了testOnBorrow开关,但受validationInterval控制,如果要求网络或数据库恢复后没有任何业务失败,可以将validationInterval设置为0,强制每次都检查,默认会使用validateQuery检查,但是用户可以提供自己的validator。如果关闭所有testXxx开关,则无论业务如何失败都不会认为是连接失效。
durid: 打开testOnBorrow开关后每次都会检查。对于业务SQL失败会对异常进行判断,以确定连接是否失效。
c3p0: 提供了testConnectionOnCheckout开关,如果打开后每次都会检查,提供了两种检查方式:jdbc validate(mysql driver发送一个ping命令)和validate query(执行配置的validationQuery)。对于业务SQL失败不认为是连接失效。
durid: 打开testOnBorrow开关后每次都会检查。对于业务SQL失败会对异常进行判断,以确定连接是否失效。
c3p0: 提供了testConnectionOnCheckout开关,如果打开后每次都会检查,提供了两种检查方式:jdbc validate(mysql driver发送一个ping命令)和validate query(执行配置的validationQuery)。对于业务SQL失败不认为是连接失效。
推荐使用方式:对于critical应用对于tomcat-jdbc建议打开testOnBorrow,并且将validationInterval设置为0。对于durid建议打开testOnBorrow,对于c3p0建议打开testConnectionOnCheckout。
其他: 作为连接池本身来说,要提高性能其实就是减少锁的争用