【问题标题】:How to load global settings frequently used in application in Java如何在 Java 中加载应用程序中常用的全局设置
【发布时间】:2014-04-20 15:51:01
【问题描述】:

1) 在我的应用程序中,我们有一个表,其中存储了一些设置详细信息,这些设置详细信息在每个功能中都被大量使用。基本上,该表中设置了一些条件,这些条件已被检查。

现在我们正在做的是时不时地进行数据库调用以获取详细信息并检查条件。这导致了很多数据库调用和针对同一条件的重复调用。条件记录相当多在此表中。我们需要对其进行更改以使其性能更好。

2) 在我之前的项目中,我也有相同的要求,我们有一个配置表,其中配置了此类设置,我们实现了它,例如在应用程序启动时从表中加载配置并将它们存储在 System.setProperty(name ,value)..然后使用 System.getProperty(name) 来检索它。如果任何设置发生更改,我们会在其 System 属性中更新它。这就像一个魅力。

但是,在我目前的情况下(上面的第 1 点),我认为我的 prev 方法不是最好的方法,因为表中存在很多包含很多列的记录。 任何人都可以提出一种如何在 Java 中实现这种行为的方法吗?其中一些我能想到的是

1) 像我解释的那样使用 System.setProperty。 2) 使用像 EHCache 这样的缓存 - 独立或与休眠一起使用(因为我们正在使用休眠)。

有没有更好的方法来存储应用程序的全局设置以避免数据库调用?

【问题讨论】:

  • 研究Properties类及其方法。
  • Map<String, String>?
  • @David- 感谢您的回复,但我想 Properties 类在这里不会有太大帮助。
  • 我不明白为什么不这样做。这是我一直用来解决您所描述的问题的方法。但这是你的应用程序,所以你最清楚。

标签: java hibernate caching ehcache


【解决方案1】:

使用 Ehcache 的最佳方法(但我从未实现过)。并且您不应该使用系统属性,它可能会导致与其他系统属性发生冲突。 在我的情况下,我是如何做到的,我创建了一个 bean 类,它的属性为你的表列,如 autoid、name、address、mobile。

public Map<Integer, PersonBean> getTag()
{
     Map<Integer, PersonBean> map= new HashMap<Integer, PersonBean>();
     Connection conn =getConnection();
     Statement st=null;
     ResultSet rs=null;
    try
    {
        String sql = "select autoid,name, address, mobile from person";//person table
         st =  conn.createStatement();


         rs = st.executeQuery(sql);
        while(rs.next()){
            int tagid=rs.getInt("autoid");
            String name=rs.getString("name");
            String address=rs.getString("address");
            String mobile=rs.getString("mobile");
            PersonBean tagdeatilbean= new PersonBean(auotoid,name, address, mobile);
            map.put(rs.getInt("autoid"), tagdeatilbean);
        }
        return map;
    }

     catch (SQLException e) {

    }
    finally
    {

    }
}

和豆类

public class PersonBean 
{
    private int autoid;
    private String name;
    private String address;
    private String mobile;
    public PersonBean(int autoid, String name, String address, String mobile)
    {
    this.autoid=autoid;
    .....
    ....
    }

    //setter
    //getter
}

如果这是web应用,那么你可以在init方法中加载这个缓存映射,并根据映射中行的autuid调用值。

【讨论】:

  • 感谢您的回复,但 Ehcache 是否有任何实现此功能的用例,因为我怀疑是否可以不时刷新缓存。对于您发布的代码,我必须以某种方式使其静态像您告诉的 init 那样加载一次并使其可用。
  • 我不知道 Ehcache。是的,你已经使用了静态地图。如果你想更新缓存,那么把这个静态地图放在 doPost 或 doGet 方法中,就像这个 if("updatecache".equals(request.getParameter("cacheupadte"){ map= getTag();} 和剩下的逻辑在 else 块中。在这种情况下,您必须触发单独的 url 来更新缓存,而无需重新启动应用程序。但是,如果您担心线程安全,那么事情就不会复杂了。
  • 但是您不认为这是企业应用程序非常常见的功能,并且有一些标准方法可以实现这一点。
  • 是的,我确实这么认为,但同样我无法在没有管理层关注的情况下实施第三方 API。获得这种许可有很长的过程,在客户和所有人适当确认之前,他们不会批准它。我正在为此非常努力地游说。到那时我会坚持这一点。如果您有更好的原生想法,可以与我分享。
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2011-10-14
  • 2013-03-14
  • 2011-02-14
相关资源
最近更新 更多