Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
使用关系型数据库的应用系统的性能瓶颈最终还是数据库,随着业务量的不断增大,会主键暴露出关系型数据库的弱点,即性能大幅度下降,提升关系型数据库的访问速度是重点;
4.1 使用Druid
https://www.cnblogs.com/iliuyuet/p/4602471.html
Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
支持的数据库
Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。
使用Druid在一定程度上可以提高数据的访问性能;
通过Druid提供的监控性能,可以实时的观察数据库连接池和SQL查询的工作情况;
1. 配置Druid依赖
com.alibaba
druid
2. 关于XML配置
Spring Boot也可以使用XML进行配置,使用@ImportResource({“class:spring-datasource.xml”})
在程序入口使用该注解即可以导入XML配置,但是,Spring Boot不推荐这样使用,而是集中在配置文件application.properties或者是application.yml中进行配置;
3. Druid数据源配置
spring:
datasource:
type:com.alibaba.druid.pool.DruidDataSource
driver-class-name:com.mysql.jdbc.Driver
url:
username:
password:
filters:stat 表示已经可以使用监控过滤器,这时候结合定义一个过滤器,就可以用来监控数据库的使用情况;
4. 开启监控功能
开启Druid的监控功能,可以在应用运行的过程中,通过监控提供的多维度数据来分析使用数据库的情况;
通过配置ServletRegistrationBean:可以添加白名单、IP黑名单、控制台管理用户、是否能够重置数据等。
配置FilterRegistrationBean可以添加过滤规则、忽略过滤的格式
开启监控功能之后,可以访问:http:localhost/druid/index.html打来控制台,输入设定的用户名和密码登录,在控制台中,可以实时的查看数据库连接池的状态,每一个被执行的SQL语句使用的情况和花费的时间,并发数量等,以及一个URI请求的次数,时间和并发数量等情况;
这就为我们分析一个应用系统中访问数据库的情况和性能提供了可靠地、详细的原始数据,可以在一些基础的细节上修改和优化一个应用访问数据库的设计;
4.2 扩展JPA功能
使用JPA,在资源库接口中不但可以按照其规则约定的方法声明各种方法,也可以使用注解@Query来定义一些简单的查询语句。
1. 扩展JPA接口
首先创造一个接口,继承于JPARepository,并将接口标记为@NoRepositoryBean,防止被当做一般的Repository调用;
2. 装配自定义的扩展接口
自定义的接口,必须在程序启动的时候装配,才能正常的使用;
3. 使用扩展接口
4.3 使用Redis缓存
在数据库使用中,数据查询是最大的性能开销。借助于Redis作为辅助缓存,可以极大地提高数据库的访问性能;
使用注解的方式使用Redis,使得代码更加的简单,简洁;
注意:Redis是一个具有持久化功能的数据库系统,如果使用默认配置,存取的数据就会永久的保存在磁盘上,如果不想这样,可以设定在Redis保存数据的期限来实现,这样能够彻底的解决Redis的负担;
始终让Redis保持轻装上阵,才能最好的发挥它的性能优势;
1. 使用Spring Cache注解
对于结构简单的对象,即没有包含其他对象的实体,可以使用Spring Cache注解的方式来使用Redis缓存。要使用Redis注解的方式来调用缓存,必须在配置类中启用Spring Cache;
https://www.cnblogs.com/duyinqiang/p/5696309.html
http://blog.csdn.net/defonds/article/details/48716161
- @Configuration
- @EnableCaching
- public class RedisCacheConfig extends CachingConfigurerSupport {
- @Bean
- public JedisConnectionFactory redisConnectionFactory() {
- JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
- // Defaults
- redisConnectionFactory.setHostName("192.168.1.166");
- redisConnectionFactory.setPort(6379);
- return redisConnectionFactory;
- }
- @Bean
- public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
- RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
- redisTemplate.setConnectionFactory(cf);
- return redisTemplate;
- }
- @Bean
- public CacheManager cacheManager(RedisTemplate redisTemplate) {
- RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
- // Number of seconds before expiration. Defaults to unlimited (0)
- cacheManager.setDefaultExpiration(3000); // Sets the default expire time (in seconds)
- return cacheManager;
- }
- }
在Service层中使用注解自动增加缓存的创建、修改和删除等功能;
@Cacheable 存取缓存
@Cacheput 修改缓存,如果不存在,则创建
@CacheEvict 删除缓存
各个注解中的value是一个key的前缀,并由keyGenerator按照一定的规则生成一个唯一的标识;
对于key的生成规则,主要使用了调用者本身的ID属性来保证它的唯一性;
2. 使用RedisTemplate
由于使用Spring Cache注解的方法使用Redis缓存,只能对简单对象进行系列化操作,所以对于像实体User这样的包含了一定关系的复杂对象,或者其他集合,列表对象等,就不能使用简单的注解的方法来实现了。
即在使用原来数据库的增删改查过程中,同时使用Redis进行辅助存取,已达到提升访问速度的目的,从而缓解对原来数据库的访问压力,这样当在访问一条数据的时候,首先从Redis中读取,如果存在则不再到MySQL读取,如果不存在则到MySQL读取,并将读取到的结果暂时保存在Redis中。
使用Redis缓存的两种方式,可以在一个应用中混合使用。但是不管怎么使用,对于控制器来讲都是完全透明的,控制器对数据接口的调用还是像之前一样,它并不清除数据接口后端是否开启了缓存;
使用了缓存之后,大量的查询语句就可以从原来的数据库服务器中转移到高效的Redis缓存中执行,这将能够很大的程度上减轻原来数据库的压力,并且提高查询的反应速度和效率。所以在很大的程度上,系统性能就得到了很大的改善;
4.4 Web应用模块
1. 引用数据管理模块
2. Web应用配置
4.6 小结
对于大数据时代的互联网应用来讲,如果要从根本上提升数据库的性能,主要还在于数据库本身的设计和配置上,例如使用分布式设计的集群系统,通过合理的配置和组装,可以达到横向扩展的目的,以后通过增加设备的方式,可以随时的扩充数据库的容量和提高其访问性能;
源代码地址:
https://github.com/chenfromsz/spring-boot-dbup
修改配置文件的application.yml的MySQL服务器URL、username、password
以及redis的host和port