Domanda

Ho questa configurazione in ibatis-config.xml

<configuration>
    <properties resource="collector.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${dev.jdbc.driver}" />
                <property name="url" value="${dev.jdbc.url}" />
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${test.jdbc.driver}" />
                <property name="url" value="${test.jdbc.url}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
    </mappers>
</configuration>

Come mostrato caricherà origine dati da <environment id="development">

DOMANDA : è possibile in fase di interruttore a tempo per uso <environment id="test"> senza modificare XML? Per esempio - ho un file di prova in cui sto usando SqlSessionFactory e voglio impostare a livello di codice per l'ambiente l'uso di test

?
È stato utile?

Soluzione

metodo SqlSessionFactoryBuilder.build () può selezionare uno specifico ambiente in XML.

Ad esempio,

private Reader reader;
private SqlSessionFactory sqlSessionFactorys;
private SqlSession session;

reader = Resources.getResourceAsReader("ibatis-config.xml");

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "test");
testSession = sqlSessionFactorys.openSession(); // test env

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "development");
devSession = sqlSessionFactorys.openSession(); // dev env

Altri suggerimenti

In base a questo sito: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

Il metodo build() chiude il lettore / inputstream prima di tornare SqlSessionFactory ora. Quindi sarà necessario aprire un nuovo lettore / flusso al fine di caricare la seconda sessione. Ho scoperto questo quando ho separato le mie tabelle di conto / di protezione a un database separato dall'applicazione DB principale. Il mio primo andare in giro ho continuato a ottenere gli errori quando il fagiolo stava cercando di caricare la fabbrica della sessione a causa di un errore di flusso di ingresso (chiuso).

per es.

try {
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH);
    prodDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, prodDbEnvironment);
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH);
    securityDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, securityDbEnvironment);
} catch (IOException ex) {
    String msg = "Unable to get SqlSessionFactory";
    CustomizedLogger.LOG(Level.SEVERE, this.getClass().getCanonicalName(), "methodName", msg, ex);
}

Anche se li ho messi in blocchi try di cattura separati in modo che io so che uno non è riuscito specificamente subito nel file di registro.

Ho anche implementare questo come un Singleton in modo che abbia solo risorse di carico di carico una volta.

Contesto: ho eseguito questo in un container Java EE e utilizzare MyBatis per le query dritto in avanti e per cui avrei utilizzare le query native in quanto si tratta di un quadro molto più semplice e diretto. Potrei passare ad usare sopra JPA ovunque, ma che è ancora oggetto di discussione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top