2011-12-16 1 views
0

나는 tomcat 6.x 용 Spring (3.1.x), JSF 2, JPA 2 (Hibernate Provider)를 사용하여 웹 응용 프로그램을 개발 중입니다. DAO 수업을 테스트하고 싶습니다. 내 응용 프로그램 데이터베이스가 MySql 아래에 있습니다. 시험을 위해 나는 메모리에서 HSQLDB를 사용하고 싶다.테이블 및 스키마 손실, hsqldb 및 maven sql 플러그인

hsqldb에서 스키마와 테이블을 만드는 스크립트를 만들었습니다. maven sql 플러그인을 사용하여 스크립트를 호출합니다.

의 pom.xml : 내 테스트 클래스가 내 스키마가없는 기존 것 같다했던 테스트 단계에서 호출 될 때

<plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>sql-maven-plugin</artifactId> 
       <version>1.5</version> 

       <dependencies> 
      <!-- specify the dependent jdbc driver here --> 
        <dependency> 
         <groupId>hsqldb</groupId> 
         <artifactId>hsqldb</artifactId> 
         <version>1.8.0.10</version> 
        </dependency> 
       </dependencies> 

     <!-- common configuration shared by all executions --> 
       <configuration> 
        <driver>org.hsqldb.jdbcDriver</driver> 
        <url>jdbc:hsqldb:mem:testOpen</url> 
        <username>sa</username> 
        <password></password> 
      <!-- You can comment out username/password configurations and 
       have maven to look them up in your settings.xml using ${settingsKey} 
      --> 
        <settingsKey>sensibleKey</settingsKey> 
      <!--all executions are ignored if -Dmaven.test.skip=true--> 
        <skip>${maven.test.skip}</skip> 
       </configuration> 

       <executions> 
        <execution> 
         <id>drop-db-before-test-if-any</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
       <!-- need another database to drop the targeted one --> 
          <url>jdbc:hsqldb:mem:testOpen</url> 
          <autocommit>true</autocommit> 
          <sqlCommand>DROP SCHEMA testOpen CASCADE</sqlCommand> 
       <!-- ignore error when database is not avaiable --> 
          <onError>continue</onError> 
         </configuration> 
        </execution> 

        <execution> 
         <id>create-db</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <url>jdbc:hsqldb:mem:testOpen</url> 
       <!-- no transaction --> 
          <autocommit>true</autocommit> 
          <sqlCommand>CREATE SCHEMA testOpen AUTHORIZATION DBA</sqlCommand> 
         </configuration> 
        </execution> 

        <execution> 
         <id>create-tables</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <url>jdbc:hsqldb:mem:testOpen</url> 
          <autocommit>true</autocommit> 
          <srcFiles> 
           <srcFile>conf/script_sql/hsqldb/create_tables.sql</srcFile> 
          </srcFiles> 
         </configuration> 
        </execution> 

        <execution> 
         <id>check-data</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <url>jdbc:hsqldb:mem:testOpen</url> 
          <autocommit>true</autocommit> 
          <printResultSet>true</printResultSet> 
          <sqlCommand>SELECT * FROM INFORMATION_SCHEMA.SYSTEM_COLUMNS WHERE TABLE_NAME NOT LIKE 'SYSTEM_%'</sqlCommand> 
         </configuration> 
        </execution> 

      </executions> 
      </plugin> 

의 persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="C4OpenPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <non-jta-data-source>java:comp/env/jdbc/open_tomcat</non-jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" /> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.transaction.flush_before_completion" value="true"/> 
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> 
      <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/> 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="C4OpenTestPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> 
      <property name="hibernate.connection.username" value="sa" /> 
      <property name="hibernate.connection.password" value="" /> 
      <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:testOpen" /> 
      <property name="hibernate.default_schema" value="testLineopen"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

는 문제입니다. 데이터 검사 실행에서 테이블은 올바른 스키마에 존재합니다. 어디에 문제가 있습니까? 테이블은 어디에 있습니까?

편집 : 또한 파일 데이터베이스로 시도하지만 잠금 문제는 실패합니다. 데이터베이스 잠금 획득 실패 : lockFile.

감사합니다.

답변

1

보고 한 "데이터베이스 잠금 획득 실패"오류는 테스트가 다른 JVM에서 실행 중임을 분명하게 나타냅니다.

테스트를위한 가장 좋은 옵션은 remote_open 옵션이있는 HSQLDB 서버 인스턴스입니다. 이 옵션은 첫 번째 연결을 만들 때 서버의 데이터베이스 (메모리 내장 데이터베이스가 될 수 있음)를 만듭니다. 자세한 내용과 예는 http://hsqldb.org/doc/2.0/guide/listeners-chapt.html을 참조하십시오.

동일한 서버 인스턴스에서 여러 번 테스트를 실행하는 경우 테스트 스위트를 실행할 때마다 스키마를 삭제할 수 있습니다.

2

다른 JVM에서 테스트가 실행되고 일부 다른 JVM에서 메모리가있는 HSQLDB에 대해 알지 못하는 것 같습니다. 메모리 대신 파일 기반을 사용하면 작동합니까?

+0

파일 데이터베이스에이 오류가 있습니다. 데이터베이스 잠금 획득에 실패했습니다. –

관련 문제