Ibatis - حدد البيئة باستخدام XML
-
27-09-2019 - |
سؤال
لدي هذا التكوين في 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 في كل مكان ، لكن هذا لا يزال للنقاش.