问题发现
由于公司架构问题,生产库与测试库难以剥离,项目的增加后生产库越来越庞大,数据库有时候面临崩溃的边缘。公司经过研究后,运维方面通过物理条件横向扩展来解决,增加库的容量、加速正式库与测试库的拆分;项目方面通过运维整理出的慢SQL集进行优化,组长通过Review代码整理项目影响数据库所在问题。
经过整理后发现一个问题,项目中有很多定时任务在跑,但是定时任务的服务中没有加多数据源,所以进行其他库的CRUD的时候,都是通过获取封装后的Druid的数据库连接池进行操作数据库。但是每个定时任务在启动时都会创建一个连接池,并没有起到缓存的作用。
public class Scheduler{
private static DataBaseFactory dataBase = new DataBaseFactory(connectConstant.DB_DRIVER,connectConstant.DB_URL,connectConstant.DB_USER,connectConstant.DB_PASSWORD);
/*业务代码*/
}
解决思路
之前数据库配置写在静态类中,准备将配置信息转移到yml文件中,写一个配置类去读取后装载一个单例数据库连接池对象,其他线程使用时注入这个配置类进行获取。
代码
① 配置文件
在application.yml文件中添加配置信息,可以自定义标签名。
report:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://ip:port/dataName?characterEncoding=UTF-8
user: ******
password: *****
② 配置类读取信息并创建对象
- prefix需要与配置文件中的头部标签匹配
- 成员属性与配置文件的子标签匹配并必须要有getter、setter方法
- 此处创建数据库连接池对象应用单例
import com.sw.www.task.database.DataBaseFactory