학습 봄 - 데이터 - JPA (이십일) --- JPA와 데이터 소스 속성 구성

1, SpringBoot 2.2.x의 기본 데이터 소스 사용

  당신이 볼 수 SpringBoot의 2.2.x 버전, 데이터 소스는 주사 데이터 소스에 의해, 기본 HikariCP에 의해 사용되며, 완전한 이름을 인쇄 직접 인쇄 할 수 있습니다.

    

  또는 자동으로 구성 할 수있는 소스 코드를보고 찾을 수 있습니다 @SpringBootApplication를 -> @EnableAutoConfiguration은 항아리 패키지 META-INF / spring.factories는 org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration-> 것이 발견 후 JpaRepositoriesAutoConfiguration를 입력 찾을 수있는 위치 당신이 HibernateJpaAutoConfiguration를 구성해야합니다 -> HibernateJpaAutoConfiguration 당신이 구성 DataSourceAutoConfiguration 필요 찾을 입력 한 후 -> DataSourceAutoConfiguration가 발견 SpringBoot 우리를 위해 세 가지 기본 구성을 제공 입력 수입 DataSourcePoolMetadataProvidersConfiguration 구성, 지점을 발견 입력 한 후, 톰캣 제공 JDBC, HikariCP는 아파치 제공 Dbcp2은 메이븐 의존성에 의해 병 패키지를 도입 모양을 사용하여 스프링 부팅 스타터 - 데이터 - 알 수 JPA 소개
하면서 스프링 부팅 스타터 JDBC 참조, 스프링 부팅 스타터 JDBC를 HikariCP, 그래서 기본은 HikariCP입니다.

@Configuration (proxyBeanMethods = 거짓 )
 공용  클래스 DataSourcePoolMetadataProvidersConfiguration { 

    @Configuration (proxyBeanMethods = 거짓 ) 
    @ConditionalOnClass (org.apache.tomcat.jdbc.pool.DataSource. 등급 )
     정적  클래스 TomcatDataSourcePoolMetadataProviderConfiguration { 

        @Bean 
        DataSourcePoolMetadataProvider tomcatPoolDataSourceMetadataProvider () { 
             (는 dataSource) -> { 
                org.apache.tomcat.jdbc.pool.DataSource tomcatDataSource = DataSourceUnwrapper.unwrap (인 dataSource
                        org.apache.tomcat.jdbc.pool.DataSource. 클래스 );
                경우 (! tomcatDataSource = 널 (null) ) {
                     반환  TomcatDataSourcePoolMetadata (tomcatDataSource); 
                } 
                반환  널 (null)을 ; 
            }; 
        } 

    } 

    @Configuration (proxyBeanMethods = 거짓 ) 
    @ConditionalOnClass (HikariDataSource. 등급 )
     정적  클래스 HikariPoolDataSourceMetadataProviderConfiguration { 

        @Bean 
        DataSourcePoolMetadataProvider hikariPoolDataSourceMetadataProvider () { 
             (는 dataSource) -> { 
                HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap (인 dataSource HikariDataSource. 클래스 );
                경우 (! hikariDataSource = 널 (null) ) {
                     반환  HikariDataSourcePoolMetadata (hikariDataSource); 
                } 
                반환  널 (null)을 ; 
            }; 
        } 

    } 

    @Configuration (proxyBeanMethods = 거짓 ) 
    @ConditionalOnClass (BasicDataSource의. 클래스)
     정적  클래스 CommonsDbcp2PoolDataSourceMetadataProviderConfiguration { 
 
        @Bean
        DataSourcePoolMetadataProvider commonsDbcp2PoolDataSourceMetadataProvider () { 
             (는 dataSource) -> { 
                BasicDataSource의 dbcpDataSource = DataSourceUnwrapper.unwrap (인 dataSource BasicDataSource의. 클래스 );
                경우 (! dbcpDataSource = 널 (null) ) {
                     반환  CommonsDbcp2DataSourcePoolMetadata (dbcpDataSource); 
                } 
                반환  널 (null)을 ; 
            }; 
        } 

    } 

}

  다른 두 개의 연결 풀을 사용하려는 경우, 당신 만 해당 의존성의 치어를 추가해야하며, 등록은 완전한 이름으로 지정 spring.datasource.type 수 있습니다.

제 2 데이터 소스 관련 구성

  DataSourceAutoConfiguration 클래스에 우리 @EnableConfigurationProperties (DataSourceProperties.class)는, 당신은 spring.datasource 구성 속성하기 시작하고, 관련 구성 DataSourceProperties 클래스를 알 수 있습니다.
  이름 : 데이터 소스의 이름이 포함 된 데이터베이스를 사용하여 기본 이름은 TESTDB입니다.
  generateUniqueName : 임의의 데이터 소스 이름을 생성할지 여부를 지정합니다.
  유형 : 달성하기 위해 연결 풀의 완전한 이름을 사용하십시오. 기본적으로 자동 클래스 경로에서 감지된다.
  driverClassName : JDBC 드라이버의 완전한 이름입니다. 기본적으로 URL을 기반으로 자동 감지.
  URL : JDBC 데이터베이스 URL.
  이름 : 데이터베이스 로그인 사용자의 이름입니다.
  암호 : 암호 데이터베이스.
  jndiName : 데이터 소스의 JNDI 위치. 언제 클래스, URL, 사용자 이름과 암호를 무시합니다 설정합니다.
  initializationMode는 : DDL 및 DML 스크립트 초기화 데이터 소스를 사용할 때 사용 가능한 기본 내장 데이터베이스를 사용합니다.
  플랫폼 : 플랫폼은 DDL 또는 DML 스크립트에 사용되는 (예를 들어, 스키마 - $ {플랫폼} .SQL 또는 데이터 - $ {플랫폼} .SQL) .
  스키마 DDL 스크립트 리소스 위치. 이 구성 후, 프로그램을 시작할 때마다 프로그램은 데이터베이스 작업의 구조에 지정된 SQL 파일을 실행합니다.
  schemaUsername : 데이터베이스 사용자 이름 DDL 스크립트의 구현입니다.
  schemaPassword는 : 데이터베이스 암호는 DDL 스크립트를 실행합니다.
  데이터 : DML 스크립트 자원 위치. 이 구성 후, 프로그램을 시작할 때마다 프로그램이 데이터베이스에서 데이터 작업을 SQL 파일을 주어진 실행됩니다.
  dataUsername : 데이터베이스 사용자 이름 DML 스크립트의 구현입니다.
  dataPassword는 : 데이터베이스 암호는 DML 스크립트를 실행합니다.
  continueOnError : 정지 여부, 데이터베이스를 초기화하는 동안 오류가 발생합니다. 거짓 기본
  SQL 초기화 스크립트 문 구분 : 구분합니다.
  sqlScriptEncoding : SQL 스크립트 코드를.
  XA : XA 설정.

3, 봄 부팅은 연결 풀 드루이드에 사용

  알리 많은 사용자를 연결 풀링을 드루이드,하지만 또한 매우 사용하기 쉽고도하는 모니터링 기능을 제공합니다. POM을 종속 관계에있는 드루이드 - 스프링 부팅 선발을 추가합니다 . 주요 범주 내에는 DruidDataSourceWrapper 호환 DataSourceProperties 구성을 갖추고, DruidDataSourceAutoConfigure이다. 연결 풀 구성의 기본 구성 DruidDataSource 및 DruidAbstractDataSource에서 볼 수 있습니다.

        <의존성> 
            <의 groupId> com.alibaba </의 groupId> 
            <artifactId를> 사제 스프링 부팅 스타트 </ artifactId를> 
            <version>은 $ {사제 스프링 - 부트 starter.version} </ 버전> 
        </ 의존성>

  3.1, 보편적 인 연결 풀 구성

#druid 연결 풀 구성 
# 초기 접속 크기 
spring.datasource.druid.initial -size. 1 = 
# 연결의 최소 수 
spring.datasource.druid.min -idle. 1 = 
# 최대 연결 
spring.datasource.druid.max 능동태 = 20 
연결 대기 시간 종료 시각 취득 # 
spring.datasource.druid.max 잠깐 = 60000 
그러한 검출 주파수 간격 # 유휴 연결 밀리 초에서 폐쇄되도록 검출 
spring.datasource.druid.time -between 런들을-eviction- = 60000 -millis 
# 최소 생존 시간 접속 밀리 풀 
spring.datasource.druid.min 밀리 -evictable-IDLE 타임 오브 = 300000 
오픈 # PSCache 및 지정 각 연결 PSCache의 크기 
스프링. datasource.druid.pool -prepared = -statements true로 
spring.datasource.druid.max= 20 --of 문 - 준비된 -pool 당 연결 크기 
# 초기가있는 경우 - 응용 프로그램 시작 시간이 최대 크기의 많은 수, 속도가 열려 있어야합니다 
spring.datasource.druid.async -init =을 true로 
필터, 속성 유형 차단 # 모니터 통계 모니터링 사용 통계 필터 : 문자열 별명 확장 모드에 의해 일반적으로 사용되는 플러그 구성된 STAT는, 로그 필터를 사용했을 때의 log4j; SQL 인젝션 방어 필터 : 벽 
spring.datasource.druid.filters = STAT

  다음과 같이 3.2, 드루이드는 또한 구성, 우리를 위해 모니터링 기능을 제공합니다 :

#druid 모니터 구성 
#StatViewServlet 구성 정보, 드루이드 위키를 참조 구성 _StatViewServlet 구성 
spring.datasource.druid.stat -보기 - servlet.enabled = true로 
# 구성 URL - 액세스 패턴 내장 된 모니터 페이지 
spring.datasource.druid.stat = servlet.url 패턴 - 더 -보기 / 드루이드 / * 
빈 통계를 허용할지 여부를 # 
spring.datasource.druid.stat -보기 - servlet.reset에 충실을 활성화 = 
# 사용자 이름과 암호 
spring.datasource.druid.stat -보기 - 사용자 이름 = 드루이드 - servlet.login 
spring.datasource.druid.stat -보기 - servlet.login - 암호 = 드루이드 
# 화이트리스트, 또는 null을 허용하도록 구성되지 않은 경우, 모든 액세스가 허용됩니다 
#의 spring.datasource.druid.stat보기 = 127.0.0.1 -servlet.allow 
# 블랙리스트에있는 경우하면 목록이 거부 될 수있는 경우에도 목록을 거부 할 수 있도록 우선 순위를 거부
spring.datasource.druid.stat-조회 servlet.deny # = 127.0.0.1 

# WebStatFilter 구성 정보 사제 위키 참조 _ 구성 WebStatFilter 배치 
에 spring.datasource.druid.web 진정한 STAT-filter.enabled = 
spring.datasource STAT-filter.url -. druid.web 패턴 = / * 
#는 *의 .js / JS / * 등 불필요한 URL을 제외 
spring.datasource.druid.web 스탯-filter.exclusions = *. JS, *. GIF, *. JPG, *. PNG, *. CSS, *. ICO / 드루이드 / * 
#session 통계 
spring.datasource.druid.web-STAT는-filter.session는-STAT는 활성화 = true로 
# STAT-filter.session - = spring.datasource.druid.web의 STAT-MAX-COUNT 
# spring.datasource.druid.web-STAT-filter.principal 세션 - 이름 - = 
# -stat-spring.datasource.druid.web 쿠키 이름은 -filter.principal = 
#의 spring.datasource.druid.web-STAT는-filter.profile 활성화 =

# 스프링 모니터 구성 정보는 설정 감시 연관된 사제 Github의 위키 및 스프링 구성 _Druid 참조 
예 xyzservice 같은 # 스프링 AOP 모니터 엔트리 포인트. *, 콤마 복수의 분리 
spring.datasource.druid.aop-패턴 = CN한다. caofanqi.study.studyspringdatajpa.controller. *

  구성 후, 프로젝트 방문 시작  에 http : // localhost를 : 8080 / 드루이드 / index.html을  같은 다음과 같습니다 :

  

  3.3, 여러 데이터 소스 구성

  구성 파일을있는 application.properties, 연결 풀 구성을 추가합니다.

#数据源1配置
spring.datasource.druid.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/study-spring-data-jpa1?characterEncoding=UTF-8&useSSL=false
spring.datasource.druid.one.username=root
spring.datasource.druid.one.password=root
spring.datasource.druid.one.initial-size=1
spring.datasource.druid.one.min-idle=1
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=10000

#数据源2配置
spring.datasource.druid.two.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.two.url=jdbc:mysql://localhost:3306/study-spring-data-jpa2?characterEncoding=UTF-8&useSSL=false
spring.datasource.druid.two.username=root
spring.datasource.druid.two.password=root
spring.datasource.druid.two.initial-size=2
spring.datasource.druid.two.min-idle=2
spring.datasource.druid.two.max-active=20
spring.datasource.druid.two.max-wait=20000

  JavaConfig配置

/**
 * 多数据源配置
 * @author caofanqi
 */
@Configuration
@Profile("multi-datasource")
public class MultiDataSourceConfig {


    @Primary
    @Bean(initMethod = "init")
    @ConfigurationProperties("spring.datasource.druid.one")
    public DataSource dataSourceOne(){
        return DruidDataSourceBuilder.create().build();
    }


    @Bean(initMethod = "init")
    @ConfigurationProperties("spring.datasource.druid.two")
    public DataSource dataSourceTwo(){
        return DruidDataSourceBuilder.create().build();
    }

}

  测试用例:

/**
 * 多数据源测试
 * @author caofanqi
 */
@SpringBootTest
@ActiveProfiles("multi-datasource")
class MultiDataSourceConfigTest {

    @Resource
    private DruidDataSource dataSourceOne;
    @Resource
    private DruidDataSource dataSourceTwo;

    @Test
    void testDataSourceOne(){

        assertThat(dataSourceOne.getUrl()).isEqualTo("jdbc:mysql://localhost:3306/study-spring-data-jpa1?characterEncoding=UTF-8&useSSL=false");
        assertThat(dataSourceOne.getUsername()).isEqualTo("root");
        assertThat(dataSourceOne.getPassword()).isEqualTo("root");
        assertThat(dataSourceOne.getDriverClassName()).isEqualTo("com.mysql.jdbc.Driver");

        assertThat(dataSourceOne.getInitialSize()).isEqualTo(1);
        assertThat(dataSourceOne.getMinIdle()).isEqualTo(1);

        assertThat(dataSourceOne.getMaxActive()).isEqualTo(10);
        assertThat(dataSourceOne.getMaxWait()).isEqualTo(10000);
    }


    @Test
     void testDataSourceTwo() {

        assertThat(dataSourceTwo.getUrl()).isEqualTo("jdbc:mysql://localhost:3306/study-spring-data-jpa2?characterEncoding=UTF-8&useSSL=false");
        assertThat(dataSourceTwo.getUsername()).isEqualTo("root");
        assertThat(dataSourceTwo.getPassword()).isEqualTo("root");
        assertThat(dataSourceTwo.getDriverClassName()).isEqualTo("com.mysql.jdbc.Driver");

        assertThat(dataSourceTwo.getInitialSize()).isEqualTo(2);
        assertThat(dataSourceTwo.getMinIdle()).isEqualTo(2);

        assertThat(dataSourceTwo.getMaxActive()).isEqualTo(20);
        assertThat(dataSourceTwo.getMaxWait()).isEqualTo(20000);
    }

}

  更多druid请看 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

4、Jpa相关属性配置

  主要在JpaProperties和HibernateProperties中。

  JpaProperties类:
    properties:Jpa提供商的本地属性。
    mappingResources:映射资源(相当于persistence.xml中的“Mapping file”)
    databasePlatform:要操作的目标数据库的名称,默认情况下自动检测。也可以使用“Database”枚举类设置。
    database:要操作的目标数据库,默认情况下自动检测。也可以使用“databasePlatform”属性进行设置。
    generateDdl:是否在启动时初始化ddl(根据实体生成表结构),默认不初始化。
    showSql:是否打印SQL,默认不显示。
    openInView:注册OpenEntityManagerInViewInterceptor。在请求的整个处理过程中将JPA EntityManager绑定到线程。

  HibernateProperties类:
    naming:命名策略。
    ddlAuto:DDL模式。这实际上是“hibernate.hbm2ddl.auto”属性的快捷方式。在使用嵌入式数据库且未检测到架构管理器时,默认为“create-drop”。否则,默认为“none”。
    useNewIdGeneratorMappings:是否使用Hibernate新的IdentifierGenerator来实现AUTO、TABLE和SEQUENCE。这实际上是“hibernate.id.new_generator_mappings”属性的快捷方式。未指定时将默认为“true”。

 

源码地址:https://github.com/caofanqi/study-spring-data-jpa

추천

출처www.cnblogs.com/caofanqi/p/12174021.html