programing

Spring Boot 2 JPA 어플리케이션에서 MariaDB에서 InnoDB 또는 XtraDB를 스토리지 엔진으로 선택하는 방법

prostudy 2022. 9. 8. 21:25
반응형

Spring Boot 2 JPA 어플리케이션에서 MariaDB에서 InnoDB 또는 XtraDB를 스토리지 엔진으로 선택하는 방법

Spring Boot 2.0.0을 사용하여 새로운 어플리케이션을 개발 중입니다.M6 및 스프링 데이터 JPA.MariaDB v10을 사용하고 있습니다.다음은 개발 속성 파일입니다.

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.username=user
spring.datasource.password=
spring.jpa.show-sql=true
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
org.hibernate.dialect.Dialect=MariaDB53Dialect
spring.jooq.sql-dialect=MariaDB53Dialect

출력:

Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM

스토리지 엔진을 변경할 수 없습니다.모든 테이블은 스토리지 엔진 MyISAM을 사용하여 생성되고 있습니다.

다른 스토리지 엔진을 사용하여 수동으로 테이블을 만들 수 있습니다.그러나 어떤 이유로 스프링 또는 휴지 상태가 MyISAM 엔진으로만 돌아갑니다.

순수 하이버네이트 자바 어플리케이션에서는 하이버네이트는 InnoDB를 기본값으로 사용합니다.

정보: HH000412:코어 {5.2.11}의 휴지 상태.최종}

휴지 상태: 테이블 휴지 상태_sequence(next_val bigint) 엔진 생성=InnoDB

Spring Boot 속성에서 데이터베이스 스토리지 엔진을 재정의하는 방법이 있습니까?

Spring Boot 매뉴얼에서 설명한 바와 같이 모든 속성 앞에는spring.jpa.properties는 프리픽스가 삭제된 상태로 기반이 되는 JPA 프로바이더(이 경우는 Hibernate)에 패스됩니다.

사투리를 설정하는 휴지 상태 속성은 다음과 같습니다.hibernate.dialect그 값은 사용하는 사투리의 완전 수식 클래스 이름이어야 합니다.이 경우, 그것은org.hibernate.dialect.MariaDB53Dialect.

상기의 내용을 종합하면, 다음의 속성을 설정할 수 있습니다.application.properties:

 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect

이를 통해 Spring Boot 기반 응용 프로그램은 MariaDB 사투리를 사용합니다.

2017-11-09 14:18:17.557  INFO 69955 --- [ost-startStop-1] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MariaDB53Dialect

휴지 상태 5.2.12를 사용하여MySQLStoredProcedureTest사투리를 마리아로 설정하면서DB:

@RequiresDialect(MariaDB53Dialect.class)
public class MySQLStoredProcedureTest 
        extends BaseEntityManagerFunctionalTestCase {

    @Override
    protected Class<?>[] getAnnotatedClasses() {
        return new Class<?>[] {
            Person.class,
            Phone.class,
        };
    }
    
    ...
    
}

Post엔티티는 다음과 같이 매핑됩니다.

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String nickName;

    private String address;

    @Temporal(TemporalType.TIMESTAMP )
    private Date createdOn;

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
    @OrderColumn(name = "order_id")
    private List<Phone> phones = new ArrayList<>();

    @Version
    private int version;

    //Getters and setter omitted for brevity
}

그리고 MariaDB에서 테스트를 실행하면 Hibernate는 다음과 같은 스키마를 생성합니다.

create table Person (
   id bigint not null,
    address varchar(255),
    createdOn datetime(6),
    name varchar(255),
    nickName varchar(255),
    version integer not null,
    primary key (id)
) engine=InnoDB

그 이유는MariaDB53Dialect를 확장하다MariaDBDialect를 사용합니다.InnoDBStorageEngine:

public class MariaDBDialect extends MySQL5Dialect {
    public MariaDBDialect() {
        super();
    }

    public boolean supportsRowValueConstructorSyntaxInInList() {
        return true;
    }

    @Override
    protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return InnoDBStorageEngine.INSTANCE;
    }
}

그래서 MyISAM을 MYISAM으로 입수할 수 없습니다.MariaDB53Dialecthbm2dl을 사용하여 스키마를 생성할 때 사용합니다.

단, 초기 스크립트를 생성할 때는 hbm2dl만 사용해야 합니다.실제 가동 환경에서는 FlywayDB와 같은 도구를 사용해야 합니다.

휴지 상태 유저 가이드에 기재되어 있습니다.

자동 스키마 생성은 테스트 및 프로토타이핑 용도로 매우 유용하지만 프로덕션 환경에서는 증분 마이그레이션 스크립트를 사용하여 스키마를 관리하는 것이 훨씬 더 유연합니다.

Hibernate 5.2.8에서 변경했기 때문에 이전 버전을 사용하고 있을 것입니다.그렇지 않으면 hbm2dl 자동 생성 스키마에 MyISAM이 표시되는 이유는 설명되지 않습니다.

다음을 사용하여 종속성을 확인합니다.

mvn dependency:tree

Hibernate 5.2.12 를 사용하고 있는 것을 확인해 주세요.

언급URL : https://stackoverflow.com/questions/47172085/how-to-select-innodb-or-xtradb-as-storage-engine-in-mariadb-in-spring-boot-2-jpa

반응형