2012-02-16 10 views
0

私はspring 3を使用し、休止状態を使用するspring rooでアプリケーションを開発しています。
バックエンドが生産的なものではないという事実のため、データをダンプに戻すオプションをネットに追加しました。Spring 3/Hibernate - ランタイム中にDBダンプを実行します。

ユーザーがjspフォームを送信する場合は、このダンプを "実行"する必要があります。 Dump.sqlファイルを読み込むことができますが、実行方法がわからないこと以外はすべて問題ありません。 私はいくつかの方法を試してみました:エンティティマネージャと
1.ネイティブクエリ:

Query q = entityManager.createNativeQuery(dump); 
q.executeUpdate(); 

しかし、それは動作しません(例外を休止状態)私は、Hibernateは「mysqlのエクスポートDump.sqlたファイルを「読む」ことができないので、それはだと思います
2ウェイは、休止状態だけを使用することでした:

Configuration cfg = new Configuration(); 
File configFile = new  File(getClass().getClassLoader().getResource("/METAINF/persistence.xml").toURI()); 
cfg.configure(configFile); 
SessionFactory sf=cfg.buildSessionFactory(); 
Session sess=sf.openSession(); 
Statement st; 
st = sess.connection().createStatement(); 

をしかし、それはどちらか動作しませんでした:

org.hibernate.MappingExceptionを:無効な構成 原因:org.xml.sax.SAXParseException:ドキュメントが無効です:文法が見つかりません。

提案がありますか?

+0

はmysqlのrecoverytoolを開始することはできませんか? – Firo

答えて

2

データベースからデータをダンプし、別のデータベースにインポートするJavaクラスを書きます(ただし、MySQLで生成されたダンプは使用しません)。たぶんあなたはそれを見てみましょう。

このクラスは、DdlUtilsDbUnitによって異なります

import java.io.IOException; 
import java.sql.SQLException; 

import javax.sql.DataSource; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.apache.ddlutils.Platform; 
import org.apache.ddlutils.PlatformFactory; 
import org.apache.ddlutils.model.Database; 
import org.dbunit.DatabaseUnitException; 
import org.dbunit.database.DatabaseConnection; 
import org.dbunit.database.IDatabaseConnection; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.operation.DatabaseOperation; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

/** 
* Dumper between databases. 
* 
* @author ndeverge 
*/ 
public final class DatabaseDumper { 

    /** 
    * Le logger. 
    */ 
    private static final Log LOGGER = LogFactory.getLog(DatabaseDumper.class); 

    /** 
    * Environment (dev, continuous integration etc...). 
    */ 
    @Value("#{envProperties['env']}") 
    private String env; 

    /** 
    * The db to dump data from. 
    */ 
    @Autowired 
    @Qualifier("referenceDataSource") 
    private DataSource sourceDataSource; 

    /** 
    * the db where to write data to. 
    */ 
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource destDataSource; 

    /** 
    * Do we need to run the dump ? 
    */ 
    private boolean doRun; 

    /** 
    * @return the doRun 
    */ 
    public boolean isDoRun() { 
     if (doRun) { 
      return true; 
     } 
     // run the dump only on continuous-integration environment 
     if ("continuous-integration".equalsIgnoreCase(env)) { 
      return true; 
     } 
     return false; 
    } 

    /** 
    * @param aDoRun 
    *   the doRun to set 
    */ 
    public void setDoRun(final boolean aDoRun) { 
     doRun = aDoRun; 
    } 

    /** 
    * Set datasources if not initialized by Spring.<br> 
    * This method is used when this utility is started from command line. 
    * 
    * @throws SQLException 
    *    on errors 
    */ 
    private void initDataSources() throws SQLException { 

     if (sourceDataSource == null || destDataSource == null) { 
      ApplicationContext context = new ClassPathXmlApplicationContext("spring/dbDumperContext.xml"); 

      sourceDataSource = (DataSource) context.getBean("referenceDataSource"); 

      destDataSource = (DataSource) context.getBean("dataSource"); 
     } 

    } 

    /** 
    * Dumper execution. 
    * 
    * @throws Exception 
    *    on errors 
    */ 
    public void execute() throws Exception { 

     if (!isDoRun()) { 
      LOGGER.debug("Do not run the dump for environment \"" + env + "\""); 
     } else { 

      LOGGER.warn("WARNING !!! Running the database dump, it may take some time..."); 

      long start = System.currentTimeMillis(); 

      // extract schema 
      Database schema = dumpSchema(sourceDataSource); 

      // create schema 
      createSchema(destDataSource, schema); 

      // extract data 
      IDataSet dataSet = dumpData(sourceDataSource); 

      // import data 
      importData(destDataSource, dataSet); 

      if (LOGGER.isDebugEnabled()) { 
       LOGGER.debug("Database dump duration = " + (System.currentTimeMillis() - start) + " ms"); 
      } 
     } 
    } 

    /** 
    * Extract schema using ddlutils. 
    * 
    * @param aSourceDataSource 
    *   source db 
    * @return an outputstream containing the schema 
    * @throws DatabaseUnitException 
    *    on errors 
    * @throws SQLException 
    *    on errors 
    * @throws IOException 
    *    on errors 
    */ 
    private IDataSet dumpData(final DataSource aSourceDataSource) throws DatabaseUnitException, SQLException, 
      IOException { 
     IDatabaseConnection sourceConnection = new DatabaseConnection(aSourceDataSource.getConnection()); 

     return sourceConnection.createDataSet(); 
    } 

    /** 
    * Extract data using dbUnit. 
    * 
    * @param aSourceDataSource 
    *   source db 
    * @return an outputstream containing the data 
    */ 
    private Database dumpSchema(final DataSource aSourceDataSource) { 
     return PlatformFactory.createNewPlatformInstance(aSourceDataSource).readModelFromDatabase("sourceModel"); 

    } 

    /** 
    * Create schema in destination db. 
    * 
    * @param aDestDataSource 
    *   the destination db 
    * @param schema 
    *   the schema 
    */ 
    private void createSchema(final DataSource aDestDataSource, final Database schema) { 
     Platform destPlatform = PlatformFactory.createNewPlatformInstance(aDestDataSource); 

     // create schema by droping tables firts (2nd parameter = true) 
     destPlatform.createTables(schema, true, true); 
    } 

    /** 
    * Data import. 
    * 
    * @param aDestDataSource 
    *   the destination db 
    * @param dataSet 
    *   the data 
    * @throws SQLException 
    *    on errors 
    * @throws DatabaseUnitException 
    *    on errors 
    */ 
    private void importData(final DataSource aDestDataSource, final IDataSet dataSet) throws DatabaseUnitException, 
      SQLException { 
     IDatabaseConnection destConnection = new DatabaseConnection(aDestDataSource.getConnection()); 

     DatabaseOperation.CLEAN_INSERT.execute(destConnection, dataSet); 
    } 

    /** 
    * Launch the dumper from commande line. 
    * 
    * @param args 
    *   paramètres 
    */ 
    public static void main(final String[] args) { 
     try { 
      DatabaseDumper dumper = new DatabaseDumper(); 
      dumper.setDoRun(true); 
      dumper.initDataSources(); 
      dumper.execute(); 
     } catch (Exception e) { 
      LOGGER.error("", e); 
     } 
    } 

} 
+0

これに感謝しますが、私は追加のフレームワークに依存せずに行くソリューションを好むでしょう – Alexander

+0

2つのデータベースが異なる場合でもこれは機能しますか? – fredcrs

+0

私はそれが大丈夫かどうかを教えてください。 –

関連する問題