如何在Java中加载应用程序中经常使用的全局设置

如何在Java中加载应用程序中经常使用的全局设置,java,hibernate,caching,ehcache,Java,Hibernate,Caching,Ehcache,1) 在我的应用程序中,我们有一个表,其中存储了大量用于每个功能的一些设置细节 现在我们正在做的是时不时地进行DB调用,以获取详细信息并检查条件。这导致了针对相同条件的大量DB调用和重复调用。此表中有相当多的条件记录。我们需要对此进行更改以使其性能更好 2) 在我以前的项目中,我也有同样的要求,我们有一个配置表,在其中配置这些设置,在那里我们实现了它,就像在应用程序启动时从表中加载配置,并将它们存储在System.setProperty(名称,值)…中,然后使用System.getPropert

1) 在我的应用程序中,我们有一个表,其中存储了大量用于每个功能的一些设置细节

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

2) 在我以前的项目中,我也有同样的要求,我们有一个配置表,在其中配置这些设置,在那里我们实现了它,就像在应用程序启动时从表中加载配置,并将它们存储在System.setProperty(名称,值)…中,然后使用System.getProperty(名称)若任何设置被更改,我们将在其系统属性中更新它。这就像一个符咒

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

1) 使用System.setProperty,如我所解释的。 2) 使用EHCache-standalone或hibernate之类的缓存(就像我们使用hibernate一样)


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

使用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
    {

    }
}

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

研究
属性
类及其方法。
映射
?@David-感谢您的响应,但我想属性类在这里没有多大帮助。我不明白为什么不这样做。我总是用它来解决你描述的问题。但这是你的申请,所以你知道的最好。谢谢你的回复,但是Ehcache是否有任何实现此功能的用例,因为我不太怀疑是否可以不时刷新缓存。对于你发布的代码,我必须以某种方式使其保持静态,以便像你告诉的init一样加载一次并使其可用。我不知道Ehcache。是的,您已经使用了静态映射..如果您想更新缓存,那么也可以将这个静态映射放在doPost或doGet方法中,就像这样
if(“updatecache”.equals(request.getParameter(“cacheupadte”){map=getTag();}
和else块中的剩余逻辑。在这种情况下,您必须触发一个单独的url来更新缓存,而无需重新启动应用程序。但是如果您担心线程安全,那么事情就不会太复杂了。但是您不认为这是企业应用程序的常见功能,并且有一些标准方法可以实现。是的,我有我也这么认为,但同样的道理,如果没有管理层的关注,我无法实施第三方api。获得此类许可需要很长的过程,只有得到客户和所有人的适当认可,他们才会批准。我正在为此努力游说。在此之前,我会坚持下去。如果你有更好的本土想法,你可以与我分享.
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
}