DBFlute.NETでのDB接続切替について

60 views
Skip to first unread message

cuted...@gmail.com

unread,
Mar 1, 2019, 8:42:49 AM3/1/19
to DBFluteユーザの集い
こんばんわ。
志水です。

毎度、お世話になっております。

毎度、レベルの低い質問で申し訳ないのですが教えてください。。
DB接続の切替なのですがどうすればいいのかわからず困っています。

1番目に本番用と、2番目にテスト用の2つの接続先を定義しているのですが
Form上でのDBアクセスは特に問題なくうまく切り替わっているのですが
今回、下記のようなTaskを使って実行した際に
Task内で実行した処理がテスト用でなく1つ目の本番用につながってしまうのです。

Task内の処理の最初に下記のようなFormでも使用している
DBのセレクター処理を呼び出して事前に変更していて
デバッグでもデータソースはテスト用を指しているように見えるのですけど・・・
実際は本番用のデータソースに接続しているようです。

根本的にやり方が間違っているのでしょうか?

以上、ご教授宜しくお願い致します。



◆DB切替処理

        /// <summary>
        /// 接続先選択
        /// </summary>
        /// <param name="KenCd"></param>
        /// <returns></returns>
        public static SelectableDataSourceProxyWithDictionary DataBaseSelector()
        {
            String basicDataSourceName = ConfigurationManager.AppSettings["BasicDataSourceName"];

            //データソース名。デフォルトは基本データソース名
            String datasourceNm = basicDataSourceName;


            if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["DefaultKenCd"]))
            {
                datasourceNm = ConfigurationManager.AppSettings["DynamicDataSourceName"] + GenericUtilities.Utilities.StaticReadonlyDefine.UNDVAR + ConfigurationManager.AppSettings["DefaultKenCd"];
            }

            //テストモードの場合
            if (CDef.OPE_MODE.TEST.Code.Equals(ConfigurationManager.AppSettings["TEST_MODE"]))
            {
                datasourceNm = datasourceNm + CDef.OPE_MODE.TEST.Alias;
            }

            SelectableDataSourceProxyWithDictionary _dataSourceDict = new SelectableDataSourceProxyWithDictionary();

            //DBの接続先をセットする
            _dataSourceDict.SetDataSourceName(datasourceNm);

            return _dataSourceDict;
        }


◆Task実行

        public void ExecutePrintShokuinDaicho(String RdlxFilePath, String DataHomePath, SessionUserDto sessionUserDto, String ResultLogFile, String RequestUrlAbsolutePath)
        {


            var task = Task.Factory.StartNew(() =>
            {

                _BatchLogic.TaskPrintShokuinDaicho(RdlxFilePath, DataHomePath, sessionUserDto, ResultLogFile, RequestUrlAbsolutePath);

            }, TaskCreationOptions.LongRunning);

        }


◆Task内で実行しているクラスでデータソース定義を宣言時に行っている
    [Implementation]
    public class BatchLogic
    {
        /// <summary>
        /// データソース選択クラス
        /// </summary>
        protected SelectableDataSourceProxyWithDictionary _dataSourceDict = WebCommonDBLogic.DataBaseSelector();




cuted...@gmail.com

unread,
Mar 2, 2019, 1:06:17 AM3/2/19
to DBFluteユーザの集い
志水です。
こんにちは。。

デバッグ実行していたら、
◆Task実行の「_BatchLogic.TaskPrintShokuinDaicho」のBatchLogicクラスもしくは
TaskPrintShokuinDaichoメソッドに入った時点で
データソースの設定がnullになっていてうまく取得できないところまではわかったので
ソースを確認したところ、ソース流用時に消し忘れていた [Transaction]定義があり
この定義を削除するとうまく制御ができるようになりました。
一応、解決なのですが
なぜ [Transaction]定義すると制御不可になってしまったのか
どうすればよかったのかがわからないままなのですが
ご教授願えないでしょうか?


以上、宜しくお願い致します。






2019年3月1日金曜日 22時42分49秒 UTC+9 cuted...@gmail.com:

kubo

unread,
Mar 3, 2019, 9:15:53 AM3/3/19
to DBFluteユーザの集い
jfluteです

志水さん、こんばんは

とりあえず自己解決されたようで良かったです。

.NETのトランザクション制御があまり詳しくないので推測ですが、
[Transaction]定義(属性!?)で、AOPによるトランザクション制御がされて、
デフォルトの状態に戻っちゃったりしないかなとか...思ったりします。

もし、厳密な挙動まで追うのであれば、
[Transaction]を評価しているコードなどを見てみると良いかと思います。
(Seasar.NETの属性だっけかな!?)

cuted...@gmail.com

unread,
Mar 4, 2019, 1:50:45 PM3/4/19
to DBFluteユーザの集い
志水です。
こんばんはー

返信ありがとうございます。
やっぱり[Transaction]のところですかね。
引数つけれるみたいですね。。
ここに何か与えてあげればいいのかなぁ・・
と理解せずに適当に考えてますが
やっぱりちょっと難しそうです・・・

ほかの皆さんは、本番DBとかテストDB接続とかの
接続を分けるのってどうしてるんですか?
ふつうはそんなことしないのかな?
私は小規模なパッケージソフトなので
お客さんでも切替ができるように
Webconfigに設定を設けて接続を切り替えれるように
したんです。で、今の事象となったんですけど。。

ちなみに、更新バッチのサンプルって
あるんでしたっけ?




2019年3月3日日曜日 23時15分53秒 UTC+9 jflute:

kubo

unread,
Mar 4, 2019, 10:19:58 PM3/4/19
to DBFluteユーザの集い
jfluteです

> ほかの皆さんは、本番DBとかテストDB接続とかの
> 接続を分けるのってどうしてるんですか?

「本番デプロイしたリリース環境で、
本番DBとテストDBを画面上の設定で動的に切り替える」
(アプリの再起動なしで)
というのであれば、確かやったことないですね。

自分はWebアプリばかりなので、
アプリ起動時の引数で本番orテストを指定して、
どのDBに接続するかを切り替えます。

ちょっと.NETの記事をぐぐってみると...

// .NETの構成ファイルを開発と本番で切り替
http://t100life.blog121.fc2.com/blog-entry-66.html

// 接続文字列の書き方をまとめてみる
https://blog.shibayan.jp/entry/20110103/1294060564

// 環境ごとに設定を変更する(DBへの接続文字列)
https://redwarrior.hateblo.jp/entry/2015/07/17/090000

.NETでもたくさん出てきますが、
「設定ファイル(App.configなど)自体を切り替える」という感じですね。
工夫してもどうしてもアプリの再起動は必要になりそうには思えます。

でも、事故防止のためにも、アプリ起動中に切り替えるというのは、
あまりやらない方が良いような気もします。



> ちなみに、更新バッチのサンプルって
> あるんでしたっけ?

DBFlute.NETに関してはないです。

cuted...@gmail.com

unread,
Mar 4, 2019, 11:13:46 PM3/4/19
to DBFluteユーザの集い
志水です。
こんにちは。。

参考記事ありがとうございます。
私もWEBが多いですがも両方やります。。
この中では構成ファイルでの変更方法が近いですね。

そっか。確かに事故防止っていうのもありますね。
ブラウザ落とすかログオフしてくれれば
セッション切れるからいいんですけど
しないと中途半端になるかもですね。
一応「テストモード」って
画面に大きく表示してますが
絶対やりがちなので
操作マニュアルに記載が必要ですね。

NET版の更新バッチのサンプルはないんですね。
Java版ならあるってことですね。
Javaかぁ。。
Java1.3の頃にやってたくらいで
ほぼ忘れたし、環境作れるかなぁ・・
あっ、まず見て解るのかって話が先か(´・ω・`)
うーん。。。
もう、尻に火が付いた時に見てみます(笑)
ありがとうございました。




2019年3月5日火曜日 12時19分58秒 UTC+9 jflute:

Masanobu Shimura

unread,
Mar 4, 2019, 11:19:10 PM3/4/19
to dbf...@googlegroups.com
私は、起動時の環境変数でurlを渡して切り替えています。

Heroku対応だと必須になりますし。

志村

2019年3月5日(火) 3:50 <cuted...@gmail.com>:
--
このメールは Google グループのグループ「DBFluteユーザの集い」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
このグループに投稿するには dbf...@googlegroups.com にメールを送信してください。
https://groups.google.com/group/dbflute からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

kubo

unread,
Mar 4, 2019, 11:21:05 PM3/4/19
to DBFluteユーザの集い
jfluteです

> NET版の更新バッチのサンプルはないんですね。
> Java版ならあるってことですね。

まあ、どちらかというと、
Java版のDBFluteとしてサンプルが用意されているというより、
たまたま LastaJob というバッチフレームワークのサンプルが、
自然とDBFluteになっているのでサンプルになっているという感じです。

DBFluteとしてはWebだろうがバッチだろうが、
DIコンテナが起動してBehaviorが動けば動くので、
あまり「バッチだから特別にこう」というのはあまりないです。

cuted...@gmail.com

unread,
Mar 5, 2019, 11:58:45 PM3/5/19
to DBFluteユーザの集い
志水です。
こんにちは。

返信ありがとうございます。
起動時の環境変数っていうのは
OSの環境変数ってことですか?
どうやって取っているんですか?




2019年3月5日火曜日 13時19分10秒 UTC+9 mikeshimura:

cuted...@gmail.com

unread,
Mar 6, 2019, 12:03:27 AM3/6/19
to DBFluteユーザの集い
志水です。
こんにちは。

接続時の[Transaction]で接続するデータソース名がデフォルトに戻されている問題ですが
そもそもデータソースを本番用とテスト用の2つに分けたのが間違いと気づきました。
以下のようにデータソースを定義しておいて
ConnectionStringHelperクラスで接続文字列を作成することで回避できました。

    <dataSource name="xxxxxxxWeb">
      <provider>SqlServer</provider>
      <connectionString>xxxxxxxxWeb.Helpers.ConnectionStringHelper</connectionString>
      <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
    </dataSource>






2019年3月5日火曜日 13時21分05秒 UTC+9 jflute:

kubo

unread,
Mar 6, 2019, 1:03:18 AM3/6/19
to DBFluteユーザの集い
jfluteです

> 環境変数
パッとググると...

// 環境変数の値を取得するには?[C#/VB]
https://www.atmarkit.co.jp/ait/articles/1803/07/news023.html

// .NET アプリで環境変数 .env ファイルを扱う
https://mseeeen.msen.jp/env-file-with-dotnet-app/

取得自体はわりと簡単にできそうですね。
App.config内での参照まではわかりませんが。

cuted...@gmail.com

unread,
Mar 6, 2019, 6:09:54 AM3/6/19
to DBFluteユーザの集い
志水です。

なるほどー。
環境変数ってこうやって取るんですね。
Envも初めて知りました。

いやぁ、勉強になるなぁ。。
ありがとうございました。



2019年3月6日水曜日 15時03分18秒 UTC+9 jflute:
Reply all
Reply to author
Forward
0 new messages