2011-09-12 60 views
1

我使用帶有dbunit的Oracle 11。 DatabaseSequenceFilter初始化大約20分鐘。slow dbunit DatabaseSequenceFilter初始化

ITableFilter filter; 

.... 

filter = new DatabaseSequenceFilter(con); 

其他數據庫操作,選擇工作正常。

什麼可以使這個問題?

謝謝。

回答

0

的問題是:我曾經通過互聯網數據庫連接。這太慢了。

0

如果您想將行導入到Oracle中,並且您的數據順序有問題,可以禁用所有外鍵,並且在導入完成後,可以再次啓用它們。如果數據中的某些內容有誤,則會收到錯誤消息。我添加了一些Bootstrap助手類。我使用Spring,你可以通過設置dataSource來初始化這個類,如果數據應該被加載,應該在導入之前清理表的屬性文件和dbunit數據集。

調用示例(春季和文件必須包含在類路徑):

<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

謝謝! 但問題是:我通過互聯網使用數據庫連接。這太慢了。 – Sisak