- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
4.1 使用 Druid
Druid 是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid 支持所有 JDBC 兼容的数据库,包括 Oracle、MySQL、Derby、PostgreSQL、SQL Server、H2 等。Druid 在监控、可扩展性、稳定性和性能方面具有明显的优势。通过 Druid 提供的监控功能,可以实时观察数据库连接池和 SQL 查询的工作情况。使用 Druid 连接池,在一定程度上可以提高数据库的访问性能。
4.1.1 配置 Druid 依赖
可以从 http://mvnrepository.com/ 中查找 Druid 的依赖配置,找到合适的版本,然后复制其中 Maven 的配置到实例工程的扩展功能模块 dpexpan 中。图 4-1 是我们查到的结果,使用的是 1.0.18 版本。图 4-1 中的 HomePage 是 Druid 的源代码链接地址。
图 4-1 查找 Druid 的依赖配置
4.1.2 关于 XML 配置
使用 Spring 开发框架时,XML 配置是经常使用的一种配置方法,其中数据源配置就是使用 XML 配置中的一种。代码清单 4-1 是一个使用 Druid 连接池的 XML 配置。使用 Spring Boot 框架也能使用 XML 配置,只要在程序入口使用一个注解,如 @ImportResource({"classpath:spring-datasource.xml"}),即可导入 XML 配置。但是,Spring Boot 不推荐这样使用,而是集中在配置文件 application.properties 或 application.yml 中进行配置。
代码清单 4-1 XML 数据源配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 驱动名称 --> <property name="DriverClassName" value="com.mysql.jdbc.Driver" /> <!-- JDBC 连接串 --> <property name="url" value="jdbc:mysql:// localhost:3306/test?useUnicode=true&characterEncoding=utf-8" /> <!-- 数据库用户名称 --> <property name="username" value="root" /> <!-- 数据库密码 --> <property name="password" value="12345678" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20" /> <!-- 初始化大小 --> <property name="initialSize" value="5" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="2" /> <!-- 逐出连接的检测时间间隔 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 最小逐出时间 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 测试有效用的 SQL Query --> <property name="validationQuery" value="SELECT 'x'" /> <!-- 连接空闲时测试是否有效 --> <property name="testWhileIdle" value="true" /> <!-- 获取连接时测试是否有效 --> <property name="testOnBorrow" value="false" /> <!-- 归还连接时是否测试有效 --> <property name="testOnReturn" value="false" /> <!-- 配置监控统计拦截的 filters --> <property name="filters" value="stat" /> </bean>
4.1.3 Druid 数据源配置
Spring Boot 的数据源配置的默认类型是 org.apache.tomcat.jdbc.pool.DataSource,为了使用 Druid 连接池,可以将数据源类型更改为 com.alibaba.druid.pool.DruidData-Source,如代码清单 4-2 所示。其中,url、username、password 是连接 MySQL 服务器的配置参数,其他一些参数设定 Druid 的工作方式。
代码清单 4-2 Druid 数据源配置
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:// localhost:3306/test?characterEncoding=utf8 username: root password: 12345678 # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中的最小生存时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开 PSCache,并且指定每个连接上 PSCache 的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的 filters,去掉后监控界面 sql 将无法统计, 'wall'用于防火墙 filters: stat,wall,log4j # 通过 connectProperties 属性来打开 mergeSql 功能;慢 SQL 记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个 DruidDataSource 的监控数据 #useGlobalDataSourceStat=true
上面配置中的 filters:stat 表示已经可以使用监控过滤器,这时结合定义一个过滤器,就可以用来监控数据库的使用情况。
注意 在 Spring Boot 低版本的数据源配置中,是没有提供设定数据源类型这一功能的,这时如果要使用上面这种配置方式,就需要使用自定义的配置参数来实现。
4.1.4 开启监控功能
开启 Druid 的监控功能,可以在应用运行的过程中,通过监控提供的多维度数据来分析使用数据库的运行情况,从而可以调整程序设计,以优化数据库的访问性能。
代码清单 4-3 定义了一个监控服务器和一个过滤器,监控服务器设定了访问监控后台的连接地址为“/druid/*”,设定了访问数据库的白名单和黑名单,即通过访问者的 IP 地址来控制访问来源,增加了数据库的安全设置,还配置了一个用来登录监控后台的用户 druid,并将密码设置为 12345678。
代码清单 4-3 开启 Druid 监控功能
@Configuration public class DruidConfiguration { @Bean public ServletRegistrationBean statViewServle(){ ServletRegistrationBean servletRegistrationBean = new ServletRegist rationBean(new StatViewServlet(),"/druid/*"); // IP 白名单 servletRegistrationBean.addInitParameter("allow","192.168.1.218,127. 0.0.1"); // IP 黑名单 (共同存在时, deny 优先于 allow) servletRegistrationBean.addInitParameter("deny","192.168.1.100"); // 控制台管理用户 servletRegistrationBean.addInitParameter("loginUsername","druid"); servletRegistrationBean.addInitParameter("loginPassword","12345678"); // 是否能够重置数据 servletRegistrationBean.addInitParameter("resetEnable","false"); return servletRegistrationBean; } @Bean public FilterRegistrationBean statFilter(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean (new WebStatFilter()); // 添加过滤规则 filterRegistrationBean.addUrlPatterns("/*"); // 忽略过滤的格式 filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*. png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
开启监控功能后,运行应用时,可以通过网址 http://localhost/durid/index.html 打开控制台,输入上面程序设定的用户名和密码,登录进去,可以打开如图 4-2 所示的监控后台。
在监控后台中,可以实时查看数据库连接池的情况,每一个被执行的 SQL 语句使用的次数和花费的时间、并发数等,以及一个 URI 请求的次数、时间和并发数等情况。这就为分析一个应用系统访问数据库的情况和性能提供了可靠、详细的原始数据,让我们能在一些基础的细节上修改和优化一个应用访问数据库的设计。
图 4-2 Druid 监控后台
如果需要了解更多有关 Druid 的使用或者下载其源代码,可以访问 https://github.com/alibaba/druid 。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论