JAVA 本番環境リリース時変更をなくす (MyBatis Datasource)

開発環境が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)のフラグ記述の変更だけで本番で動く

コメントを残す