如何从数据库加载和重置Web应用程序中的配置映射

亚历克斯

我需要从数据库加载配置映射。配置映射表示为

   Hashtable<String, Hashtable<String,String>>

我们不能一开始就加载映射,因为我们依赖于另一个war应用程序进行数据库连接。所以,该映射被装载在类(singleton)的所述第一呼叫到配置ResourcesStorage实施ServletContextListener同时,重置JSPreset()在此侦听器中调用静态方法。我使用reentrant添加了同步我只锁定重置,因为不同的线程应该能够同时检索数据。但是,这不能很好地工作。

我正进入(状态

IllegalMonitorStateException  on notFull.await();   
java.lang.IllegalMonitorStateException
        at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.fullyRelease(AbstractQueuedSynchronizer.java:1606)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1922)

我的设计正确吗?

import java.util.Hashtable;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ResourcesStorage implements ServletContextListener {

private static ResourcesStorage instance;
protected static Log log = LogFactory.getLog(ResourcesStorage.class);
protected Hashtable<String, Hashtable<String,String>> DBsettings =new Hashtable    <String, Hashtable<String,String>>();
private ServletContext context = null;
private boolean isLoading = false;

 public synchronized boolean isLoading() {
    return isLoading;
}

public  synchronized void setLoading(boolean isLoading) {
    this.isLoading = isLoading;
}

private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();

public void contextDestroyed(ServletContextEvent arg0) {}

public void contextInitialized(ServletContextEvent event) {

    this.context = event.getServletContext();
        //initialize the static reference _instance
    instance=this;
    reloadAllSettings();
}

public  Hashtable<String, Hashtable<String,String>> getDBSettings()
{
    return DBsettings;
}
public static String getSettings(String groupName, String keyName)
{
    ResourcesStorage instance = ResourcesStorage.getInstance();
    Hashtable<String, Hashtable<String,String>> dbsettings = instance.getDBSettings();
    Hashtable<String,String> group =(Hashtable<String,String>) dbsettings.get(groupName);
    if(group!=null && !group.isEmpty())
        return group.get(keyName);
    else
        return null;
}

public String getValueSettings (String groupName, String keyName)
{
    try 
    {
        while (isLoading() == false)
        {
             notFull.await();
        }
        Hashtable<String,String> group =(Hashtable<String,String>) DBsettings.get(groupName);
        if(group!=null && !group.isEmpty())
        {
            return group.get(keyName);
        }
        else
        {
            return null;
        }
    }
    catch (Exception e)
    {
        log.error("getValueSetting", e);    
    }
    return null;
}

public static void reSet(){
    ResourcesStorage instance = ResourcesStorage.getInstance();
    instance.reloadAllSettings();
}

public void reloadAllSettings(){
    lock.lock();
    setLoading(true);
    try
    {
// .....            
//getting resources from the database 
        setLoading(false);
        notFull.signal();
    } catch (Exception e) {
//...
    }
    finally
    {
        lock.unlock();
    }
}

public static ResourcesStorage getInstance() 
{
    return instance;
}

public ServletContext getContext() {
    return context;
}

public void setContext(ServletContext context) {
    this.context = context;
}
}
小册子

意见建议:

设置已加载或尚未加载。如果已加载它们,请使用它们。

如果尚未加载,请调用同步方法。这是您唯一需要的锁定机制。在方法中检查是否已加载它们(由于竞争条件),如果已加载,请返回。否则,请在阻止其他正在等待的线程时获取它们。

确保将设置引用保留在可变变量中。

编辑:

我的建议不支持让多个线程同时加载相同的数据。这是故意的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在应用程序和Web之间共享数据库

来自分类Dev

hbase作为Web应用程序中的数据库

来自分类Dev

汽车数据库Web和桌面应用程序的数据库设计

来自分类Dev

如何在Web应用程序中连接分布式数据库?

来自分类Dev

如何在应用程序中嵌入数据库?

来自分类Dev

如何在WPF应用程序中同时支持本地和远程数据库

来自分类Dev

Modulus上的Meteor应用程序-如何重置数据库

来自分类Dev

在Heroku上,如何安排Postgres数据库以使我的Rails应用程序定期重置?

来自分类Dev

如何将数据从MySql数据库加载到列表(基于控制台的应用程序)中?

来自分类Dev

在应用程序启动时如何将值(用户和users_profiles)加载到数据库中?

来自分类Dev

多个Django数据库-将模型映射到同一应用程序中的数据库

来自分类Dev

JSP的Web应用程序的数据库连接无法加载

来自分类Dev

对允许独立配置文件的Web应用程序使用多个数据库

来自分类Dev

应用程序启动时如何将数据从数据库加载到Ehcache

来自分类Dev

如何配置数据库以在我的应用程序启动时删除数据库表中的所有内容

来自分类Dev

如何通过ASP.NET Web应用程序和WPF桌面应用程序访问同一数据库

来自分类Dev

如何通过asp.net Web应用程序和WPF桌面应用程序访问同一数据库

来自分类Dev

如何将FileMaker Pro数据库加载到iOS应用程序?

来自分类Dev

Spring Web 应用程序中的映射配置错误

来自分类Dev

如何配置 SQLite 数据库以在 Flask 应用程序中使用

来自分类Dev

应用程序尝试在数据库中执行查询时“未配置CurrentSessionContext”

来自分类Dev

使用数据库中的许可证配置验证MVC应用程序的使用

来自分类Dev

使用数据库中的配置初始化应用程序组件

来自分类Dev

在Spring Boot应用程序中即时配置数据库

来自分类Dev

使用数据库中的许可证配置验证MVC应用程序的使用

来自分类Dev

如何在具有PostgreSQL数据库的Web应用程序中具有完整的脱机功能?

来自分类Dev

如何解密存储在数据库中并由jhipster Web应用程序生成的密码?

来自分类Dev

如何检查Yii2应用程序中的Web进程是否可以写入sqlite数据库文件?

来自分类Dev

无法将数据从 Firebase 实时数据库检索到 Web 应用程序中

Related 相关文章

  1. 1

    在应用程序和Web之间共享数据库

  2. 2

    hbase作为Web应用程序中的数据库

  3. 3

    汽车数据库Web和桌面应用程序的数据库设计

  4. 4

    如何在Web应用程序中连接分布式数据库?

  5. 5

    如何在应用程序中嵌入数据库?

  6. 6

    如何在WPF应用程序中同时支持本地和远程数据库

  7. 7

    Modulus上的Meteor应用程序-如何重置数据库

  8. 8

    在Heroku上,如何安排Postgres数据库以使我的Rails应用程序定期重置?

  9. 9

    如何将数据从MySql数据库加载到列表(基于控制台的应用程序)中?

  10. 10

    在应用程序启动时如何将值(用户和users_profiles)加载到数据库中?

  11. 11

    多个Django数据库-将模型映射到同一应用程序中的数据库

  12. 12

    JSP的Web应用程序的数据库连接无法加载

  13. 13

    对允许独立配置文件的Web应用程序使用多个数据库

  14. 14

    应用程序启动时如何将数据从数据库加载到Ehcache

  15. 15

    如何配置数据库以在我的应用程序启动时删除数据库表中的所有内容

  16. 16

    如何通过ASP.NET Web应用程序和WPF桌面应用程序访问同一数据库

  17. 17

    如何通过asp.net Web应用程序和WPF桌面应用程序访问同一数据库

  18. 18

    如何将FileMaker Pro数据库加载到iOS应用程序?

  19. 19

    Spring Web 应用程序中的映射配置错误

  20. 20

    如何配置 SQLite 数据库以在 Flask 应用程序中使用

  21. 21

    应用程序尝试在数据库中执行查询时“未配置CurrentSessionContext”

  22. 22

    使用数据库中的许可证配置验证MVC应用程序的使用

  23. 23

    使用数据库中的配置初始化应用程序组件

  24. 24

    在Spring Boot应用程序中即时配置数据库

  25. 25

    使用数据库中的许可证配置验证MVC应用程序的使用

  26. 26

    如何在具有PostgreSQL数据库的Web应用程序中具有完整的脱机功能?

  27. 27

    如何解密存储在数据库中并由jhipster Web应用程序生成的密码?

  28. 28

    如何检查Yii2应用程序中的Web进程是否可以写入sqlite数据库文件?

  29. 29

    无法将数据从 Firebase 实时数据库检索到 Web 应用程序中

热门标签

归档