Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to load from database and reset Configuration mapping in Web application
    primarykey
    data
    text
    <p>I need to load Configuration mapping from the database. The configuration mapping is represented as </p> <pre><code> Hashtable&lt;String, Hashtable&lt;String,String&gt;&gt; </code></pre> <p>We cannot load the mapping on the start since we depend on another war application for database connection. So, the mapping is loaded on the first call to configuration in the class(singleton) <code>ResourcesStorage</code> implementing <code>ServletContextListener</code>. At the same time the reset JSP calls static <code>reset()</code> method in this listener. I added synchronization using <code>reentrant</code> lock. I am locking only resetting because different threads should be able to retrieve data simultaneously. However, this does not work well. </p> <p>I am getting </p> <pre><code>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) </code></pre> <p>Is my design correct?</p> <pre><code>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&lt;String, Hashtable&lt;String,String&gt;&gt; DBsettings =new Hashtable &lt;String, Hashtable&lt;String,String&gt;&gt;(); 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&lt;String, Hashtable&lt;String,String&gt;&gt; getDBSettings() { return DBsettings; } public static String getSettings(String groupName, String keyName) { ResourcesStorage instance = ResourcesStorage.getInstance(); Hashtable&lt;String, Hashtable&lt;String,String&gt;&gt; dbsettings = instance.getDBSettings(); Hashtable&lt;String,String&gt; group =(Hashtable&lt;String,String&gt;) dbsettings.get(groupName); if(group!=null &amp;&amp; !group.isEmpty()) return group.get(keyName); else return null; } public String getValueSettings (String groupName, String keyName) { try { while (isLoading() == false) { notFull.await(); } Hashtable&lt;String,String&gt; group =(Hashtable&lt;String,String&gt;) DBsettings.get(groupName); if(group!=null &amp;&amp; !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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload