2011-09-12 38 views
1

私はdbunitでOracle 11を使用します。 DatabaseSequenceFilterの初期化は約20分です。dbunit DatabaseSequenceFilterの初期化が遅い

ITableFilter filter; 

.... 

filter = new DatabaseSequenceFilter(con); 

他のデータベース操作、選択は正常に動作します。

この問題を解決するにはどうすればよいですか?

ありがとうございました。

答えて

0

問題だった:私は、インターネットを経由してDB接続を使用していました。これは遅すぎた。

0

行をOracleにインポートする際に、データの順序に問題がある場合は、すべての外部キーを無効にできます。インポートが完了したら、それらを再度有効にできます。あなたのデータに何か間違っていると、エラーメッセージが表示されます。 Bootstrapヘルパークラスを追加しました。私はSpringを使用し、このクラスを初期化するには、dataSource、データをロードする必要がある場合はフラグ、インポートする前にクリーニングする必要があるテーブルのテーブル名を持つプロパティファイル、dbunitデータセットを設定します。

例call(春・ファイルがクラスパスに含まれていなければならない):

<bean id="bootLoader" class="com.esentri.bootstrap.BootDataLoader"> 
    <constructor-arg index="0"><ref bean="dataSource"/></constructor-arg>   <!-- dataSource --> 
    <constructor-arg index="1" value="true"/>          <!-- initializeTestData --> 
    <constructor-arg index="2" value="${profile.environment}"/>          <!-- environmentName --> 
    <constructor-arg index="3" value="bootstrap/cleanUpDataSource.properties"/> <!-- cleanUpDataSourcePath --> 
    <constructor-arg index="4" value="bootstrap/defaultData.xml"/>    <!-- dataSourcePath --> 
</bean> 

とクラスは次のとおりです。

public BootDataLoader(DataSource dataSource, String initializeTestData, String environmentName, String cleanUpDataSourcePath, String dataSourcePath){ 
    logger.info("================================================================================"); 
    logger.info(" Start Bootstrapping: BootLoader initialized..."); 


    //skip importing data if this const-arg is set to false or if environment is not development 
    if(initializeTestData.equals("false") || (!environmentName.equals("dev") && !environmentName.equals("test"))) { 
     logger.warn("--------------------------------------------------------------------------------------------"); 
     logger.warn("DATABASE DATA IMPORT IS DISABLED (initializeTestData="+initializeTestData.toString()+", environmentName="+environmentName.toString()); 
     logger.warn(" BootLoading will be terminated..."); 
     logger.warn("--------------------------------------------------------------------------------------------"); 
     return; 
    } 


    logger.warn("--------------------------------------------------------------------------------------------"); 
    logger.warn("OVERRIDING DATABASE WITH TEST DATA. TURN ON INFO TO SEE DETAILS"); 
    logger.warn("--------------------------------------------------------------------------------------------"); 
    logger.info("JVM DEFAULT CHARSET = '" + Charset.defaultCharset() +"'"); 
    logger.info("cleanUpDataSourcePath = '" + cleanUpDataSourcePath +"'"); 
    logger.info("dataSourcePath = '" + dataSourcePath +"'"); 
    logger.info("connect to database..."); 
    Connection con = null; 
    IDatabaseConnection dbUnitCon = null; 
    try { 
     con = DataSourceUtils.getConnection(dataSource); 
     dbUnitCon = new DatabaseConnection(con); 

    } catch(DatabaseUnitException e) { 
     e.printStackTrace(); 
    } 
    DatabaseConfig config = dbUnitCon.getConfig(); 
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new Oracle11DataTypeFactory()); 
    config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, false); 
    config.setProperty(DatabaseConfig.FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES, true); 



    //LOAD DATASET 
    logger.info("load dataSet from dataSource..."); 
    FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder(); 
    builder.setColumnSensing(true); 
    IDataSet dataSet = null; 
    try { 
     ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
     InputStream is = cl.getResourceAsStream(dataSourcePath); 
     dataSet = builder.build(is); 
    } catch (Exception e) { 
     logger.error("Failed loading BootLoad dataSource '"+dataSourcePath+"'"); 
     e.printStackTrace(); 
    } 
    logger.info("...done"); 



    //CLEAN TABLES 
    logger.info("clean tables defined in cleanUpDataSource..."); 
    Properties props = new Properties(); 
    String table; 
    String del = "DELETE FROM "; 
    try { 
     ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
     InputStream is = cl.getResourceAsStream(cleanUpDataSourcePath); 
     props.load(is); 
    } catch (Exception e) { 
     logger.error("Failed loading BootLoad cleanUpDataSource '"+cleanUpDataSourcePath+"'"); 
     e.printStackTrace(); 
    } 
    Iterator it = props.keySet().iterator(); 
    Statement stmt; 
    while (it.hasNext()){ 
     table = (String)it.next(); 
     logger.info(" DELETE FROM "+table); 
     try { 
      stmt = con.createStatement(); 
      stmt.execute(del+table); 
      stmt.close(); 
      con.commit(); 
     } catch (Exception e) { 
      logger.error("Error cleaning table '"+table+"'"); 
      e.printStackTrace(); 
     } 

    } 
    logger.info("...done"); 



    //DISABLE ALL FOREIGN KEYS 
    logger.info("disable all foreign keys..."); 
    try { 
     Statement stmtDisableAllConstaints; 
     String disableAllConstaints = 
       " begin" + 
       " for i in (select constraint_name, table_name from user_constraints where constraint_type ='R' and status = 'ENABLED') LOOP" + 
       "  execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';" + 
       " end loop;" + 
       " end;"; 
     stmtDisableAllConstaints = con.createStatement(); 
     stmtDisableAllConstaints.execute(disableAllConstaints); 
     stmtDisableAllConstaints.close(); 
     con.commit(); 
    } catch (Exception e) { 
     logger.error("Error disabling foreign keys"); 
     e.printStackTrace(); 
    } 
    logger.info("...done"); 



    //IMPORT DATA 
    logger.info("import data from '"+dataSourcePath+"'"); 
    try { 
     DatabaseOperation.CLEAN_INSERT.execute(dbUnitCon,dataSet); 
    } catch (Exception e) { 
     logger.error("Error importing data"); 
     e.printStackTrace(); 
    } 
    logger.info("...done"); 


    //ENABLE FOREIGN KEYS 
    logger.info("enable all foreign keys..."); 
    try { 
     Statement stmtEnableAllConstaints; 
     String disableAllConstaints = 
       " begin" + 
       " for i in (select constraint_name, table_name from user_constraints where constraint_type ='R' and status = 'DISABLED') LOOP" + 
       "  execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';" + 
       " end loop;" + 
       " end;"; 
     stmtEnableAllConstaints = con.createStatement(); 
     stmtEnableAllConstaints.execute(disableAllConstaints); 
     stmtEnableAllConstaints.close(); 
     con.commit(); 
    } catch (Exception e) { 
     logger.error("Error enabling foreign keys"); 
     e.printStackTrace(); 
    } 
    logger.info("...done"); 


    //CLOSE CONNECTION 
    logger.info("close connection"); 
    DataSourceUtils.releaseConnection(con, dataSource); 
    logger.info("...done"); 

    logger.info(" BootLoader ended"); 
    logger.info("================================================================================"); 
} 
+0

ありがとうございます! しかし問題は、私はインターネット経由でdb接続を使用していました。これは遅すぎた。 – Sisak

関連する問題