복붙노트

[SPRING] Spring을 통해 스크립트를 사용하여 메모리 내 HSQLDB를 초기화하는 방법

SPRING

Spring을 통해 스크립트를 사용하여 메모리 내 HSQLDB를 초기화하는 방법

DAO (Spring과 Hibernate 사용)의 단위 테스트를 시도하고 있습니다. 이 튜토리얼에서는 HSQLDB를 사용하고 있습니다. 이 튜토리얼에서는 SQL 스크립트를 사용하여 메모리 내 HSQLDB 데이터베이스를 초기화 할 수 있다고 설명하지만 Spring에서이를 수행하는 방법에 대한 정보는 찾을 수 없습니다. 다음은 적절한 Spring 컨텍스트 설정입니다.

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:mydb" />
    <property name="username" value="sa" />
    <property name="password" value="" />
    <property name="initialSize" value="5" />
    <property name="maxActive" value="10" />
    <property name="poolPreparedStatements" value="true" />
    <property name="maxOpenPreparedStatements" value="10" />
</bean> 

어떤 도움을 주시면 감사하겠습니다. 감사.

해결법

  1. ==============================

    1.메모리 내장 데이터베이스와 Spring을 사용하여 작업하려는 경우 Spring 3에 대한 새로운 jdbc 네임 스페이스가있어 임베디드 데이터베이스 작업을 매우 쉽게 할 수 있습니다.

    메모리 내장 데이터베이스와 Spring을 사용하여 작업하려는 경우 Spring 3에 대한 새로운 jdbc 네임 스페이스가있어 임베디드 데이터베이스 작업을 매우 쉽게 할 수 있습니다.

    가장 중요한 부분은 DataSource 역할을하므로 기존 DataSource bean을 쉽게 대체 할 수 있습니다.

    <jdbc:embedded-database id="dataSource" type="HSQL">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>
    

    Java Config에서이 작업을 수행하는 데 관심이 있다면 EmbeddedDatabaseBuilder (Spring 3.0의 새로운 기능)를 살펴보십시오.

    @Configuration
    public class DatabaseTestConfig {
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .addScript("classpath:schema.sql")
                .addScript("classpath:test-data.sql")
                .build();
        }
    }
    
  2. ==============================

    2.Nicholas 대답은 완벽하게 괜찮지 만 jdbc 네임 스페이스를 사용하여 외부 데이터베이스를 초기화 할 수도 있습니다.

    Nicholas 대답은 완벽하게 괜찮지 만 jdbc 네임 스페이스를 사용하여 외부 데이터베이스를 초기화 할 수도 있습니다.

    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/DS"/>
    
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="classpath:/META-INF/database/init.sql"/>
    </jdbc:initialize-database>
    
  3. ==============================

    3.튜토리얼에서 연결하는 방법 중 하나는 설정하는 방법입니다 (확실한 수정 후).

    튜토리얼에서 연결하는 방법 중 하나는 설정하는 방법입니다 (확실한 수정 후).

    나는 이것이 관련있는 것처럼 보일 것이라고 생각한다. 완전 경로 화 된 파일 이름처럼 보이는 것으로 path-to-file을 바꾸는 것이 좋습니다 ...

  4. ==============================

    4.이 문제를 해결하려면 initExecuteSqlFile 및 destroyExecuteSqlFile이라는 두 개의 새 속성에 대한 getters / setters를 사용하여 BasicDataSource의 하위 클래스를 만들어 실행할 SQL 파일 목록을 쉼표로 구분할 수 있습니다. 서브 클래스에는 init / destroy SQL 파일을 처리하는 init () 및 destroy () 메소드가 있습니다.

    이 문제를 해결하려면 initExecuteSqlFile 및 destroyExecuteSqlFile이라는 두 개의 새 속성에 대한 getters / setters를 사용하여 BasicDataSource의 하위 클래스를 만들어 실행할 SQL 파일 목록을 쉼표로 구분할 수 있습니다. 서브 클래스에는 init / destroy SQL 파일을 처리하는 init () 및 destroy () 메소드가 있습니다.

    그런 다음 다음 bean 정의를 사용하십시오.

    <bean
        id="datasource"
        class="com.example.MyBasicDataSource"
        destroy-method="destroy"
        init-method="init"
    >
        <property name="destroyExecuteSqlFile">
            <value>h2-destroy-01.sql</value>
        </property>
        <property name="initExecuteSqlFile">
            <value>h2-init-01.sql,h2-init-02.sql,h2-init-03.sql</value>
        </property>
        <!-- Other properties -->
    </bean>
    
  5. ==============================

    5.임베디드 데이터베이스를 사용하면 동일한 JVM에서만 데이터베이스에 연결할 수 있습니다. 성능 또는 기타 제약 조건을 위해 두 개의 JVM이있는 경우 다음을 수행 할 수 있습니다.

    임베디드 데이터베이스를 사용하면 동일한 JVM에서만 데이터베이스에 연결할 수 있습니다. 성능 또는 기타 제약 조건을 위해 두 개의 JVM이있는 경우 다음을 수행 할 수 있습니다.

  6. from https://stackoverflow.com/questions/9329283/how-to-initialize-in-memory-hsqldb-using-script-via-spring by cc-by-sa and MIT license