سؤال

لدي هذا التكوين في 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>

كما هو موضح ، سيتم تحميل مصاعد البيانات من <environment id="development">

سؤال: هل من الممكن استخدام مفتاح وقت التشغيل <environment id="test"> دون تعديل XML؟ على سبيل المثال - لدي ملف اختبار حيث أستخدمه SqlSessionFactory وتريد تعيينها برمجيا لاستخدام بيئة الاختبار؟

هل كانت مفيدة؟

المحلول

يمكن لـ SQLSessionFactoryBuilder.Build () تحديد بيئة محددة في XML.

علي سبيل المثال،

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

نصائح أخرى

وفقا لهذا الموقع:http://codenav.org/code.html؟project=/org/mybatis/mybatis/3.2.5&path=/source٪20packages/org.apache.ibatis.session/sqlsessionfactorybuilder.java

ال build() الطريقة تغلق القارئ/inputStream قبل إعادة SQLSessionFactory الآن. لذلك ستحتاج إلى فتح قارئ/دفق جديد لتحميل الجلسة الثانية. لقد اكتشفت ذلك عندما قمت بفصل جداول حسابي/أمان إلى قاعدة بيانات منفصلة عن DB التطبيق الرئيسي. أول ذهاب لي ، ظللت أحصل على أخطاء عندما كانت الفول تحاول تحميل مصنع الجلسة بسبب خطأ في دفق الإدخال (مغلق).

على سبيل المثال

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

على الرغم من أنني وضعتها في منفصلة ، حاول كتل الصيد حتى أعرف أيهما فشل على الفور على الفور في ملف السجل.

أقوم أيضًا بتنفيذ هذا كـ Singleton بحيث يتعين عليه تحميل الموارد مرة واحدة فقط.

السياق: أقوم بتشغيل هذا في حاوية Java EE وأستخدم MyBatis للاستعلامات المستقيمة للأمام وللحصول على الاستعلامات الأصلية لأنها إطار أبسط ومباشر إلى الأمام. قد أتحول إلى استخدامه عبر JPA في كل مكان ، لكن هذا لا يزال للنقاش.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top