開発環境がWindows, 実行環境がLinuxの場合、そのままでは動かないので、違う設定する必要ありますが、最小限に済ます方法です。
1) 環境設定用xmlは、UNPOOLED (Windows開発環境) と JNDI (Linux本番環境)の2種類を用意。
開発用
<environment id="ocean">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="${msdriver}"/>
<property name="url" value="${msurl}"/>
<property name="username" value="${msusername}"/>
<property name="password" value="${mspassword}"/>
</dataSource>
</environment>
本番用
<environment id="ocean">
<transactionManager type="JDBC"/>
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/ocean2"/>
</dataSource>
</environment>
2) web.xml の context に判別できる記述をしておく
<!-- Datasource JNDI pooled or Unpooled -->
<context-param>
<param-name>IsDSJNDI</param-name>
<param-value>0</param-value>
</context-param>
3) Startupのサーブレットで、2)を読み、public static な変数に入れておく
静的設定クラス
/**
* Mybatis設定
*/
public static final String MB_RESOURCE = "vesselsch/mybatis/SqlMapConfigLocal.xml"; // 開発用、DRバックアップ用
public static final String MB_RESOURCE_JNDI = "vesselsch/mybatis/SqlMapConfigJNDI.xml"; // サービス用
public static boolean isDSJNDI = false;
Startup
ServletContext cntxt = getServletContext();
// データソースがJNDIかどうか //
DBini.isDSJNDI = cntxt.getInitParameter("IsDSJNDI").equals("1");
4) sqlSessionFactory の生成にあたって、リソース読込で 3)を使う
/**
* MyBatis SQLセッションファクトリ
*/
protected SqlSessionFactory sqlSessionFactory = null;
/*
コンストラクタ
*/
public MyBatisParent() {
// MyBatis //
try {
// 開発環境 or サービス環境で違える UNPOOLED or JNDI //
InputStream inputStream = Resources.getResourceAsStream(DBini.isDSJNDI ? DBini.MB_RESOURCE_JNDI : DBini.MB_RESOURCE);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
catch (IOException ie) {
ie.printStackTrace();
}
}
5) 4) は親クラスのコンストラクタで行い、継承された子クラスでの個別設定はなくす
利用例
public ArrayList<ExRate> selectExRateSheet() {
List list = null;
try (SqlSession session = sqlSessionFactory.openSession()) {
list = session.selectList("selExRate", this);
System.out.println("selectExRateSheet:" + list.size());
}
catch (Exception se) {
se.printStackTrace();
}
return new ArrayList(list);
}
6) 結果、2)のフラグ記述の変更だけで本番で動く