代码之家  ›  专栏  ›  技术社区  ›  Shekhar

管理配置数据的最佳方法是什么

  •  27
  • Shekhar  · 技术社区  · 16 年前

    我在一个产品套件,其中有4个产品。现在,所有配置数据要么在XML中,要么在属性中文件。这个这种方法是不可维护的,因为我们必须为不同的环境(例如生产、开发等)管理不同的配置文件。

    处理配置数据的最佳方法是什么?

    另外,我们能否将其模块化为一个单独的模块?使所有产品都能使用这个模块。 我们不想使用属性文件。我正在寻找一个解决方案,我们可以移动所有的配置特定的代码作为一个新的配置模块,并坚持在数据库中的所有配置数据。

    8 回复  |  直到 9 年前
        1
  •  21
  •   Benoît Sauvère    11 年前

    使用 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");
    
        2
  •  12
  •   Nicole    16 年前

    你就快到了。。。我将保留您相同的方法,并为通过类似于以下方法之一的方法运行的应用程序实例拉入正确的配置文件:

    1. 将所有配置文件命名为不同的名称,并让应用程序根据一些唯一的条件(用户名、主机名等)将它们拉入:

      • 生产 .属性
      • 显影剂1 .属性
      • 显影剂2 .属性
    2. 根据应用程序假定存在的环境变量,将它们保留在代码库之外的某个位置:

      • 你的应用程序配置目录 /服务器_配置.xml
      • 你的应用程序配置目录

        3
  •  5
  •   Tomislav Nakic-Alfirevic    16 年前

    如果应用程序使用数据库,则可以按如下方式创建“配置”表:

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

    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+ 刀,卡宴……)你通常用来 将核心应用程序数据处理到
        4
  •  4
  •   zznate    16 年前

    对于我们所有的环境,配置数据都以属性文件的形式存在于目标机器上。我们使用 PropertyPlaceholderconfigurer

        <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èu简介中(或其他): 导出JAVA\u OPTS=“-Ddatabase.configuration.file文件.url=文件:///etc/myapp/数据库.properties"

    或者只是调用“java”时传入的相同-D选项,这取决于您正在做什么。

        5
  •  2
  •   joevartuli    14 年前

    有很多不同的策略。所有这些都是好的,取决于你最适合什么。

    1. 构建单个工件并将配置部署到单独的位置。工件可以有占位符变量,并且在部署时可以读入配置。看看Springs属性占位符。对于使用Spring的webapps来说,它的工作非常出色,而且不涉及操作。
    2. 具有位于webapp外部的外部化属性配置。保持位置不变,并始终从属性配置中读取。在任何阶段更新配置,重新启动都会更新新值。
    3. 如果您正在修改环境(即正在使用的应用程序服务器或用户/组权限),请将上述方法与puppet或chef一起使用。还可以看看如何使用这些工具管理配置文件。
        6
  •  0
  •   Colby Cox    9 年前

    System.getenv("...")

        7
  •  0
  •   Bienvenido David    8 年前

    Config 是一个配置文件管理工具。您可以创建在所有环境中通用的配置,也可以创建特定于环境的配置。您可以继续使用XML和属性文件,并让Config维护环境中的差异。您可以将Config视为您的集中式数据库,它可以以您想要的格式输出配置文件。无论何时需要配置文件,只需将其从Config部署(推送或拉送)到所需位置。请注意,我是配置团队的一员。

        8
  •  -4
  •   petertc    11 年前

    这里有一个简单愚蠢的解决方案。

    代码段,它首先尝试使用当前目录中的属性文件。如果失败,则改用资源目录(或jar文件)中的属性文件。

        Properties configFile = new Properties();
        try {
            configFile.load(new FileInputStream("production.properties"));
        } catch (Exception e) {
            System.err.println("Can not read properties, try to use default properties file.");
            configFile.load(this.getClass().getClassLoader().
                        getResourceAsStream("development.properties"));
        }
    
    推荐文章