🦾

【Spring Boot】application.ymlの設定例

2023/03/19に公開

設定例

application.yml
server:
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
  tomcat:
    accept-count: 500
    max-connections: 10000
    threads:
      max: 500
      min-spare: 500

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo_db?useAffectedRows=true&useUnicode=true&characterEncoding=utf8&serverTimezone=SERVER&allowMultiQueries=true
    username: root
    password: password
    prepStmtCacheSize: 250
    prepStmtCacheSqlLimit: 2048
    cachePrepStmts: true
    useServerPrepStmts: true
    rewriteBatchedStatements: true
    cacheResultSetMetadata: true
    casheServerConfiguration: true
    elideSetAutoCommits: true
    maintainTimeStats: true
    hikari:
      connection-test-query: SELECT 1 FROM DUAL
      idle-timeout: 100000
      max-lifetime: 120000
  mybatis:
    configuration:
      map-underscore-to-camel-case: true
  springdoc:
    cashe:
      disabled: true
    api-docs:
      enabled: true

Common Application Properties

基本的に公式ドキュメントに説明が記載されているので、こちらを参考にする。
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html

server

server:
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
  tomcat:
    accept-count: 500
    max-connections: 10000
    threads:
      max: 500
      min-spare: 500

エンコーディングのサポート、文字コードは指定しておいた方が良い。
tomcat関連はパフォーマンスおよびメモリの使用量にも影響するので、必要に応じて調整する。
特に、maxやmin-spareが小さいと常時待機しているスレッド数が少なくて処理集中したときに遅くなる可能性があるので注意。

datasource

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo_db?useAffectedRows=true&useUnicode=true&characterEncoding=utf8&serverTimezone=SERVER&allowMultiQueries=true
    username: root
    password: password
    prepStmtCacheSize: 250
    prepStmtCacheSqlLimit: 2048
    cachePrepStmts: true
    useServerPrepStmts: true
    rewriteBatchedStatements: true
    cacheResultSetMetadata: true
    casheServerConfiguration: true
    elideSetAutoCommits: true
    maintainTimeStats: true
    hikari:
      connection-test-query: SELECT 1 FROM DUAL
      idle-timeout: 100000
      max-lifetime: 120000

MySQLのところになるが、URLでpropertiesを指定できるので必要なら忘れずに。
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-jdbc-url-format.html
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html

この例で少し注意が必要なのはこの2つ

  • useAffectedRows
    INSERT ... ON ON DUPLICATE KEY UPDATE 構文実行で取得できる数値に影響がある。
    挿入/更新の結果に対してどういう風に処理したいかにもよるので注意。
    https://zenn.dev/yoshio_matsuda/scraps/d16f585845f1e6

  • allowMultiQueries
    MyBatisのmapperの内で複数のSQLステートメントを記述し実行させることが可能となる。
    一つのxmlもしくはメソッドで複数ステートメントを実行できるので、責務の分離に注意しないと雑なコードを作り出すことになる。

その他パフォーマンス関連で推奨設定は以下を参考に設定すると良い。
基本的にキャッシュ設定やステートメントまとめて実行/コミットする設定だったりする。
https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration

connection poolingはHikariCPを使う。
max-lifetimeはデフォルトで1800000ミリ秒(30分)だが、少し短くします。idle-timeoutも。
他に調整したい設定は以下を参考にする。

https://github.com/brettwooldridge/HikariCP

mybatis

  mybatis:
    configuration:
      map-underscore-to-camel-case: true

mapUnderscoreToCamelCaseはアンダースコア形式のカラム名を自動でキャメルケースに変換してくれるので便利。その他設定可能なものは以下を参考にする。
https://mybatis.org/mybatis-3/configuration.html#settings

spring-doc

  springdoc:
    cashe:
      disabled: true
    api-docs:
      enabled: true

springdoc-openapiはSwagger-uiによるAPIドキュメント生成をコードからできるので便利。
開発時でAPIの更新頻度が高いときはキャッシュはオフにした方が良い。
それに関する設定は以下を参考にする。

https://springdoc.org/#springdoc-openapi-core-properties

Discussion