web-dev-qa-db-ja.com

構成データを管理する最良の方法は何ですか

4つの製品がある製品スイートに取り組んでいます。現在、すべての構成データはXMLファイルまたはプロパティファイルのいずれかにあります。異なる方法(本番環境、開発環境など)で異なる構成ファイルを管理する必要があるため、このアプローチは維持できません。

したがって、構成データを処理する最良の方法は何ですか?

また、これを別のモジュールにモジュール化できますか?すべての製品がこのモジュールを使用できるように。プロパティファイルは使用しません。すべての構成固有のコードを新しい構成モジュールとして移動し、すべての構成データをデータベースに保持できるソリューションを探しています。

28
Shekhar

commons-configuration を使用すると、プロパティにアクセスするための統一されたAPIがありますどのように表示されても-.properties、xml 、JNDIなど。例:

config.properties

jdbcHost=192.168.12.35
jdbcUsername=dbuser
jdbcPassword=pass

config.xml

<config>
   <jdbcHost>192.168.12.35</jdbcHost>
   <jdbcUsername>dbuser</jdbcUsername>
   <jdbcPassword>pass</jdbcPassword>
</config>

どちらの場合も、次のような方法でアクセスできます。

String Host = config.getString("jdbcHost");
22
Bozho

もう少しで完了です...同じアプローチを維持し、次のいずれかのような方法で実行されているアプリケーションのインスタンスの正しい構成ファイルを取得します。

  1. すべての構成ファイルに異なる名前を付け、アプリケーションにいくつかの固有の基準(ユーザー名、ホスト名など)でそれらを取得させます。

    • production。properties
    • developer1。properties
    • developer2。properties
  2. アプリケーションが存在すると想定する環境変数に基づいて、コードベースの外部の場所にそれらを保持します。

    • YOURAPP_CONFIG_DIR/server_config.xml
    • YOURAPP_CONFIG_DIR/database_config.properties

同じプロジェクトでこれらのアプローチを組み合わせて使用​​したこともあります(ビルドプロセス構成では#1、ランタイム構成では#2)。

12
Nicole

アプリケーションがデータベースで動作する場合、次のように「構成」テーブルを作成できます。

create table configuration (mode char(3), key varchar(255), value varchar(1023));

Initスクリプトを使用して初期化します。たとえば、次のような内容のinit.sqlを使用します。

insert into configuration values ('pro', 'param1', 'value1'); -- production
insert into configuration values ('dev', 'param1', 'value1'); -- development
insert into configuration values ('tst', 'param1', 'value1'); -- testing
...

このアプローチの利点は次のとおりです。

  • あなたはあなたのコードと一緒にスクリプトをバージョン管理します
  • ユーザー/グループIDを追加することで、ユーザーごとまたはグループごとの設定を含めるように簡単に拡張できます。
  • 必要に応じて、実行時に設定を変更できます
  • コアアプリケーションデータを処理して構成データを処理するために通常使用するのと同じスタック(JPA + DAO、Cayenne ...)を使用する

すべての環境で、構成データはプロパティファイルの形式でターゲットマシンに存在します。 SpringFrameworkの PropertyPlaceholderconfigurer を使用してこれらのプロパティをアプリにバインドし、環境間での移植性を維持します。

たとえば、アプリが実行されるすべてのマシンに/etc/myapp/database.propertiesが存在することがわかっている限り、Spring構成では、次のようなものが必要です。

    <bean id="myPropertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/etc/myapp/database.properties</value>
        </list>
    </property>
</bean>
<bean id="myDataSource" class="org.Apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"
        value="jdbc:mysql://${db.Host}:3306/${db.name}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.pass}" />     
</bean>

そのSpringクラスには、プロパティファイルを配置できる場所に関する多数のオプションがあります。それらを置換して、環境変数として渡すこともできます。

    <bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="searchSystemEnvironment" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
        <list>
            <value>${database.configuration.file.url}</value>
        </list>
    </property>
</bean>

そしてbash_profile(または何でも):export Java_OPTS = "-Ddatabase.configuration.file.url = file:///etc/myapp/database.properties"

または、何をしているのかに応じて、「Java」を呼び出すときに渡されるのと同じ-Dオプション。

FWIW、私たちはRPMとしてプロパティファイルを個別に維持します。

4
zznate

さまざまな戦略がたくさんあります。それらのすべてが良好であり、あなたに最も合うものに依存します。

  1. 単一のアーティファクトをビルドし、構成を別の場所にデプロイします。アーティファクトにはプレースホルダー変数を含めることができ、デプロイメント時に構成を読み取ることができます。Springsプロパティプレースホルダーを確認してください。これは、Springを使用し、opsの関与を必要としないWebアプリケーションに最適です。
  2. Webappの外部にある外部化されたプロパティ構成を持っている。場所を一定に保ち、常にプロパティ構成から読み取ります。任意の段階で構成を更新すると、再起動すると新しい値が有効になります。
  3. 環境(つまり、使用されているアプリケーションサーバーまたはユーザー/グループのアクセス許可)を変更する場合は、上記のメソッドをパペットまたはシェフで使用することを確認してください。これらのツールを使用して構成ファイルを管理する方法もご覧ください。
2
joevartuli

環境変数は、最も簡単な方法です。他の場合と同じように設定して、System.getenv("...")を使用してアクセスします

0
Colby Cox

Config は、構成ファイル管理ツールです。すべての環境に共通の構成を作成することも、環境固有の構成を作成することもできます。 XMLファイルとプロパティファイルを使い続け、環境設定の違いをConfigに維持させることができます。 Configは一元化されたデータベースと考えることができ、必要な形式で構成ファイルを出力できます。構成ファイルが必要なときはいつでも、それをConfigから目的の場所にデプロイ(プッシュまたはプル)するだけです。私はConfigチームの一員であることに注意してください。

0