春ブーツ2.xの基礎:国内のデータベース接続プールのドルイドの使用

1で、我々は、デフォルトのデータソースHikariCPを使用してJDBCモジュール自動化された構成で春ブーツを導入しました。ドルイド:そして、このセクションでは、我々は別の広く使われているオープンソースのデータ・ソースをご紹介します。

ドルイドはアリババ部門データベースのオープンソースプロジェクトによって生成されます。それに加えて、高性能なデータベース接続プールでデータベース接続プールの監視を運んでいます。HikariCPは非常に良いされているが、しかし、国内のユーザーのために、ドルイドのほうがなじみかもしれません。だから、春ブーツでドルイドを使用する方法の基本的なスキルを習得するために、開発者が必要とするバックエンドです。

ドルイド構成されたデータソース

我々はに基づいて行われます。このセクション練習「JdbcTemplate使用してアクセスMySQLデータベースへの春ブーツ2.xのベースのチュートリアル」:テキストに基づいてコードを。だから、読者は、テキストの終わりから検出リポジトリをコーディングすることができchapter3-1、次のハンズオン学習のためのディレクトリを。

ここでは、春ブーツドルイドプロジェクトのデータソースの構成を開始する必要があります。

最初のステップpom.xml春ブーツスターターパッケージの導入が正式提供をドルイド。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>
复制代码

ステップ二つ:ではapplication.properties、構成データベースに接続情報。

ドルイドのように配置されているspring.datasource.druidわずかに修正、以前によれば、プレフィックス構成を:

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
复制代码

第三段階:ドルイド接続プールの構成。

そして、ひかりは、使用良いのデータソースとして、我々は次のような、その接続プールの適切な設定を行う必要があります。

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat
复制代码

ドルイドは、次の表に記載されています各接続プールの設定についての説明:

コンフィギュレーション デフォルト値 説明
名前 この属性の重要度を設定すると、複数のデータソースを監視するために存在する場合は、地域名で区別できるときということです。ない、名前が生成され、フォーマットがある場合:.「DataSource-」+ System.identityHashCode(本) このプロパティは、さらに、バージョン1.0.5に少なくとも配置されていない不活性であり、誤差を強制的に集合名であろう。詳細-こちらをクリックしてください
URL データベースへの接続URL、別のデータベースは同じではありません。例:mysqlのします。jdbc:mysqlの://10.20.153.104:3306 / druid2オラクルます。jdbc:oracle:thin:10.20.149.85 @:1521:ocnauto
ユーザ名 データベースを接続するためのユーザー名
パスワード データベース接続のためのパスワード。あなたが設定ファイルに直接コードを記述したくない場合は、ConfigFilterを使用することができます。詳細はここを見て
driverClassName 自動認識のURL この機能は、自動的にのdbType URLを識別ドルイド構成に基づいていない場合には価値があるが、その後、適切なdriverClassNameを選択することができます
INITIALSIZE 0 物理的な接続の初期化の数を確立します。ディスプレイはinitメソッド、または最初のgetConnectionを呼び出すときに初期化が起こります
MAXACTIVE 8 接続プールの最大数
maxIdle 8 それはもはや全く影響を装備し、使用されていません
minIdle 接続プールの最小数
MAXWAIT 最大待機時間をミリ秒単位で、接続されている取得します。必要に応じてMAXWAITを設定した後、デフォルトの公正なロックでは有効になって、同時効率が真の不公平なロックに設定useUnfairLockプロパティを使用して、減少します。
poolPreparedStatements PSCacheあるキャッシュのPreparedStatement、かどうか。PSCacheサポートデータベースは、oracleなど、巨大なパフォーマンスの向上を、カーソル。mysqlのの提案閉鎖の下で。
maxPoolPreparedStatementPerConnectionSize -1 PSCacheを可能にするために、0よりも大きいが、poolPreparedStatementsが自動的にtrueに変更トリガさゼロコンフィギュレーション、より大きくなければなりません。ドルイドでは、PSCacheは、Oracleの問題のためにあまりにも多くのメモリを存在しない、この値は、100のような、より大きな構成することができます
validationQuery 有効な接続、SQLかどうかを検出するために、クエリが必要とされ、一般的には、「X」を選択します。validationQueryがnullの場合、testOnBorrow、testOnReturn、testWhileIdleは動作しません。
validationQueryTimeout 単位:有効な接続がタイムアウトするかどうか、第2の検出。空setQueryTimeoutレベルは、JDBCのStatementオブジェクト(int型秒)メソッドを呼び出します
testOnBorrow validationQuery接続を申請する際、接続が有効であるかどうかを検出実行は、この構成は、パフォーマンスが低下することがありました。
testOnReturn 返された接続は、接続を検出この構成は、パフォーマンスが低下することが行われ、有効な実行validationQueryです。
testWhileIdle 推奨構成は、パフォーマンスに影響を与え、そして安全性を保証するものではない、本当です。アイドル時間がtimeBetweenEvictionRunsMillisより大きい場合、アプリケーション接続は、validationQuery接続検出を行うが有効であるときを検出します。
生き続ける 偽(1.0.28) アイドルタイムminEvictableIdleTimeMillisのminIdle接続プール内の接続数は、キープアライブ動作が実行されます。
timeBetweenEvictionRunsMillis 1分間(1.0.14) これは、2つの意味を有する:接続アイドル時間がより大きいかminEvictableIdleTimeMillisは、物理接続を閉じる等しい場合1)検出は、ねじ接続を破壊間隔。2)testWhileIdle判断根拠、プロパティtestWhileIdleの詳細な説明を参照してください
numTestsPerEvictionRun 30分(1.0.14) 不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis 连接保持空闲而不被驱逐的最小时间
connectionInitSqls 物理连接初始化的时候执行的sql
exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

到这一步,就已经完成了将Spring Boot的默认数据源HikariCP切换到Druid的所有操作。

配置Druid监控

既然用了Druid,那么对于Druid的监控功能怎么能不用一下呢?下面就来再进一步做一些配置,来启用Druid的监控。

第一步:在pom.xml中引入spring-boot-starter-actuator模块

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码

第二步:在application.properties中添加Druid的监控配置。

spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
复制代码

上面的配置主要用于开启stat监控统计的界面以及监控内容的相关配置,具体释意如下:

  • spring.datasource.druid.stat-view-servlet.url-pattern:访问地址规则
  • spring.datasource.druid.stat-view-servlet.reset-enable:是否允许清空统计数据
  • spring.datasource.druid.stat-view-servlet.login-username:监控页面的登录账户
  • spring.datasource.druid.stat-view-servlet.login-password:监控页面的登录密码

第三步:针对之前实现的UserService内容,我们创建一个Controller来通过接口去调用数据访问操作:

@Data
@AllArgsConstructor
@RestController
public class UserController {

    private UserService userService;

    @PostMapping("/user")
    public int create(@RequestBody User user) {
        return userService.create(user.getName(), user.getAge());
    }

    @GetMapping("/user/{name}")
    public List<User> getByName(@PathVariable String name) {
        return userService.getByName(name);
    }

    @DeleteMapping("/user/{name}")
    public int deleteByName(@PathVariable String name) {
        return userService.deleteByName(name);
    }

    @GetMapping("/user/count")
    public int getAllUsers() {
        return userService.getAllUsers();
    }

    @DeleteMapping("/user/all")
    public int deleteAllUsers() {
        return userService.deleteAllUsers();
    }

}
复制代码

第四步:完成上面所有配置之后,启动应用,访问Druid的监控页面http://localhost:8080/druid/,可以看到如下登录页面:

img

输入上面spring.datasource.druid.stat-view-servlet.login-usernamespring.datasource.druid.stat-view-servlet.login-password配置的登录账户与密码,就能看到如下监控页面:

img

进入到这边时候,就可以看到对于应用端而言的各种监控数据了。这里讲解几个最为常用的监控页面:

数据源:这里可以看到之前我们配置的数据库连接池信息以及当前使用情况的各种指标。

img

SQL监控:该数据源中执行的SQL语句极其统计数据。在这个页面上,我们可以很方便的看到当前这个Spring Boot都执行过哪些SQL,这些SQL的执行频率和执行效率也都可以清晰的看到。如果你这里没看到什么数据?别忘了我们之前创建了一个Controller,用这些接口可以触发UserService对数据库的操作。所以,这里我们可以通过调用接口的方式去触发一些操作,这样SQL监控页面就会产生一些数据:

img

图中监控项上,执行时间、读取行数、更新行数都通过区间分布的方式表示,将耗时分布成8个区间:

  • 0 - 1 耗时0到1毫秒的次数
  • 1 - 10 耗时1到10毫秒的次数
  • 10 - 100 耗时10到100毫秒的次数
  • 100 - 1,000 耗时100到1000毫秒的次数
  • 1,000 - 10,000 耗时1到10秒的次数
  • 10,000 - 100,000 耗时10到100秒的次数
  • 100,000 - 1,000,000 耗时100到1000秒的次数
  • 1,000,000 - 耗时1000秒以上的次数

记录耗时区间的发生次数,通过区分分布,可以很方便看出SQL运行的极好、普通和极差的分布。 耗时区分分布提供了“执行+RS时分布”,是将执行时间+ResultSet持有时间合并监控,这个能方便诊断返回行数过多的查询。

SQL防火墙:该页面记录了与SQL监控不同维度的监控数据,更多用于对表访问维度、SQL防御维度的统计。

img

该功能数据记录的统计需要在spring.datasource.druid.filters中增加wall属性才会进行记录统计,比如这样:

spring.datasource.druid.filters=stat,wall
复制代码

注意:这里的所有监控信息是对这个应用实例的数据源而言的,而并不是数据库全局层面的,可以视为应用层的监控,不可能作为中间件层的监控。

代码示例

本文的相关例子可以查看下面仓库中的chapter3-3目录:

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

欢迎关注我的公众号:程序猿DD,获得独家整理的学习资源和日常干货推送。 如果您对我的专题内容感兴趣,也可以关注我的博客:didispace.com

おすすめ

転載: juejin.im/post/5e40ca33e51d4526dd1e96e8