Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理多个应用程序中使用的大型静态配置类?_Java_Oop_Configuration_Object Oriented Analysis - Fatal编程技术网

Java 如何处理多个应用程序中使用的大型静态配置类?

Java 如何处理多个应用程序中使用的大型静态配置类?,java,oop,configuration,object-oriented-analysis,Java,Oop,Configuration,Object Oriented Analysis,分配给我的一组相关应用程序共享一个配置值的数据库表,该表包含“应用程序”、“配置名称”、“配置类型”(即字符串、整数)和“配置值”列。还有一个存储过程,它接收字符串(applicationName),并返回applicationName==application的所有配置名称、类型和值 在每个应用程序中,都会实例化一个包装类,其中包含一个静态ThreadLocal(以下称为“静态配置”),该静态配置会从应用程序的配置表中提取所有值 加载配置值时,存储过程返回大量迭代的属性列表,遍历大量if-el

分配给我的一组相关应用程序共享一个配置值的数据库表,该表包含“应用程序”、“配置名称”、“配置类型”(即字符串、整数)和“配置值”列。还有一个存储过程,它接收字符串(applicationName),并返回applicationName==application的所有配置名称、类型和值

在每个应用程序中,都会实例化一个包装类,其中包含一个静态ThreadLocal(以下称为“静态配置”),该静态配置会从应用程序的配置表中提取所有值

加载配置值时,存储过程返回大量迭代的属性列表,遍历大量if-else语句列表,测试“config_name”列是否与字符串文本匹配,如果匹配,则将值加载到不同名称的变量中

例:

每个应用程序的配置范围在60-100ish之间,每个应用程序都有一个相同的配置类,只保留它们试图读取的属性的名称

因此,我的问题是:

  • 拥有一个庞大的配置类是糟糕的设计,对吗?我不完全确定如何分解它们,我不能在这里共享它们,但我假设最佳做法是拥有多个配置类,这些类具有执行特定操作所需的所有组件,即“LocalDatabaseConfig”或“(ExternalSystemName)DatabaseConfig”

  • 一旦出现故障,在没有静态访问的情况下,在需要的地方获取配置值的最佳方法是什么?如果我让每个类实例化它所需的配置,我将执行大量冗余的db操作,但如果我只是从应用程序入口点传递它们,那么许多类必须“保留”数据,而不需要将其提供给以后的类。。。此时静态配置类是最佳选择吗

  • 有没有一种优雅的方法可以从DB加载属性(在核心java中,该公司对第三方库非常特别),而不必使用这个庞大的if-else链我一直认为理想情况下,我们只需动态加载引用的每个属性,但我能想到的唯一方法是使用另一个存储过程,它接受属性的唯一标识符,并以这种方式加载它,但这将涉及更多的字符串文本…m

  • (可能由3无效)对于上面的伪代码中的比较,有没有更好的方法来测试属性而不是使用字符串文字?如果我们同意在应用程序中以与数据库中相同的方式命名配置属性,那么这个问题可以解决吗

  • 目前每个应用程序都只是复制粘贴这个配置类,并替换字符串文本和变量名;许多值在名称和值上是唯一的,有些值是唯一的,但在应用程序之间命名相同(反之亦然),有些值对于每个应用程序都是相同的名称和值,但由于存储过程基于应用程序获取值,所以需要冗余的db条目(尽管许多这样的值在任何时候都应该是相同的,对其中一个值的任何更改也需要在其他版本上执行)。创建一个核心库类来构造任何建议的“分解”配置类有意义吗?即,每个应用程序都需要一些基本的日志记录配置,这些配置在应用程序之间不会改变。我们已经有了一个核心库,它是每个应用程序的依赖项,但我不知道它是否会使se将所有/部分/无配置类添加到核心库


  • 感谢您的帮助!很抱歉有这么多问题!?

    使用
    while
    循环将数据库查询结果复制到两个映射中,可以消除级联的
    if-then-else
    ,一个是基于字符串的配置变量的
    映射[String,String]
    ,另一个是
    映射[String,Integer]
    用于整数配置变量。然后该类可以提供以下操作:

    public String lookupStringVariable(String name, String defaultValue) {
      String value = stringMap.get(name);
      if (value == null) {
        return defaultValue;
      } else {
        return value;
      }
    }
    public int lookupIntVariable(String name, int defaultValue) {
      Integer value = intMap.get(name);
      if (value == null) {
        return defaultValue;
      } else {
        return value.intValue();
      }
    }
    
    如果需要(可能是为了运行时性能)将配置值存储在配置类的字段中,那么配置类可以将上述两个操作
    设置为private
    ,并使用它们初始化字段。例如:

    logLevel = lookupIntVariable("log_level", 2);
    logDir = lookupStringVariable("log_dir", "/tmp");
    

    替代方案(但互补)建议编写一个代码生成器应用程序,该应用程序将查询DB表,并为DB表的
    application
    列中的每个值生成一个单独的Java类。生成的Java类的实现将使用您想要的任何编码方法来查询DB表并检索特定于应用程序的配置n个变量。编写此生成器应用程序后,只要更新DB表以添加/修改配置变量,就可以重新运行它。如果决定编写这样的生成器,可以使用
    print()
    语句来生成Java代码。或者,您可以使用模板引擎来减少与
    print()相关的一些详细信息
    语句。模板引擎的一个示例是,但列表中还有几十个。

    您最好将数据库访问与应用程序初始化分开。基本定义是通过查询一个应用程序的设置返回的
    Map

    Map<String,String> config = dbOps.getConfig("myappname");
    // which populates a map from the config_name/config_value queries:
    // AS: config.put(result.getString("config_name"), result.getString("config_value");
    
    void init(Map<String,String> config) {
        myConfigurationValue1 = config.get("myConfig1");
        myConfigurationValue2 = config.get("myConfig2");
    }
    
    void init(Map<String,String> config) {
        myConfigurationValue1 = config.get("myConfig1");
        myConfigurationValue2 = config.get("myConfig2");
    }
    
    void init(Config config) {
        myConfigurationValue1 = config.get("myConfig1", "aDefaultVal");
        myConfigurationInt2   = config.getInt("myConfig2", 100);
    }