Pregunta

I tienen esta configuración en 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>

Como se muestra se carga la fuente de datos de <environment id="development">

PREGUNTA : ¿Es posible en el interruptor de tiempo de ejecución para el uso <environment id="test"> sin modificar XML? Por ejemplo - Tengo un archivo de prueba en la que estoy usando SqlSessionFactory y desea establecer mediante programación al entorno de prueba de uso

?
¿Fue útil?

Solución

método SqlSessionFactoryBuilder.build () puede seleccionar un entorno específico en el XML.

Por ejemplo,

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

Otros consejos

De acuerdo con este sitio: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

El método build() cierra el lector / InputStream antes de volver SqlSessionFactory ahora. Por lo que tendrá que abrir un nuevo lector / corriente para cargar la segunda sesión. Esto lo descubrí cuando me separé mis tablas cuenta / seguridad de una base de datos independiente de la aplicación DB principal. Mi primer intento en torno seguí recibiendo errores cuando el grano estaba tratando de cargar la fábrica sesión debido a un error de flujo de entrada (cerrado).

por ejemplo.

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);
}

A pesar de que los puse en bloques de intento de captura por separado para que yo sepa cuál no específicamente de inmediato en el archivo de registro.

También implementar esto como un conjunto unitario de modo que sólo tiene a los recursos de carga de carga de una vez.

Contexto: corro esto en un contenedor Java EE y uso MyBatis para consultas recta hacia adelante y para dónde iba a utilizar consultas nativas, ya que es un marco mucho más simple y sencillo. Podría cambiar a usarla por la APP en todas partes, pero que sigue siendo un tema de debate.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top