DataCaching Problem

Hi --
I just enabled caching in my single-JVM application. Now, when I delete
an "photo", it gives me an exception. It appears like the object
deletion code goes through to commit successfully, and then subsequent
accesses to Kodo, give the exception. If I disable caching and do the
exact same sequence, no error occurs.
My code look like this:
Photo photo = (Photo)pm.getObjectById(photoId, false);
// first, delete any thumbnails...
Extent extent = pm.getExtent(PhotoThumbnail.class, false);
Query query = pm.newQuery(extent);
query.setFilter("photo == aPhoto");
query.declareParameters("Photo aPhoto");
Collection photosToDelete = (Collection)query.execute(photo);
pm.deletePersistentAll(photosToDelete);
// second, delete the photo itself
pm.deletePersistent(photo);
And there's the exception and trace...
500 Servlet Exception
javax.jdo.JDODataStoreException: The instance
"net.nearlythere.business.data.Photo-202"
does not exist in the data store.
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:864)
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:785)
     at com.solarmetric.kodo.runtime.PCData.lookup(PCData.java:517)
     at com.solarmetric.kodo.runtime.PCData.getData(PCData.java:493)
     at com.solarmetric.kodo.runtime.PCData.load(PCData.java:210)
     at com.solarmetric.kodo.runtime.PCData.load(PCData.java:112)
     at
com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:221)
     at
com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:112)
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:863)
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:785)
     at com.solarmetric.kodo.runtime.PCData.lookup(PCData.java:517)
     at com.solarmetric.kodo.runtime.PCData.getData(PCData.java:493)
     at com.solarmetric.kodo.runtime.PCData.load(PCData.java:210)
     at com.solarmetric.kodo.runtime.PCData.load(PCData.java:112)
     at
com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:221)
     at
com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:112)
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:863)
     at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:768)
     at
net.nearlythere.business.CoreSiteBuilder.getObjectById(CoreSiteBuilder.java:3450)
     at net.nearlythere.business.BaseBusiness.getSite(BaseBusiness.java:278)
     at net.nearlythere.business.BaseBusiness.<init>(BaseBusiness.java:138)
     at net.nearlythere.business.CoreSiteBuilder.<init>(CoreSiteBuilder.java:80)
     at
net.nearlythere.business.FactoryBusiness.newCore(FactoryBusiness.java:38)
     at net.nearlythere.frontend.controllers.site.Home.preDisplay(Home.java:61)
     at
net.nearlythere.frontend.controllers.ControllerDisplay.perform(ControllerDisplay.java:29)
     at net.nearlythere.frontend.controllers.Controller.go(Controller.java:1126)
     at org.infohazard.maverick.ctl.Throwaway2.go(Throwaway2.java:48)
     at
org.infohazard.maverick.flow.ThrowawayControllerAdapter.go(ThrowawayControllerAdapter.java:58)
     at org.infohazard.maverick.flow.CommandBase.go(CommandBase.java:41)
     at org.infohazard.maverick.Dispatcher.service(Dispatcher.java:179)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
     at
com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
     at com.caucho.server.http.Invocation.service(Invocation.java:311)
     at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:218)
     at
com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:160)
     at com.caucho.server.TcpConnection.run(TcpConnection.java:137)
     at java.lang.Thread.run(Thread.java:536)
Resin 2.1.1 (built Mon May 13 16:53:21 PDT 2002)

That's exactly what I'm saying. Consider what's happening -- you are
deleting a given object, but not deleting the reference to it from other
objects. So, your object model is in an invalid state -- you have a
reference in PhotoThumbnail to an object that does not exist.
Because this is a relatively common behavior, we've written our one-one
JDBC mapping code to allow for this type of data corruption -- if we
load an object and can't find a related object, we silently set it to
null, assuming that this happened because the related data was deleted.
However, our data cache code did not do the corresponding check, which
is why you were seeing problems when using the data cache only.
(In a future release, this behavior will probably be customizable, so
you can decide how strictly we check your object model integrity.)
So, by maintaining your object model properly (ensuring that you don't
leave references to deleted items lying around), you provide our data
cache with enough information to properly clean things up.
The best practice for using JDO is to keep your object model consistent.
-Patrick
Dan Finkelstein wrote:
Wait... what do you mean by that? I'm basically calling Kodo to delete
all PhotoThumbnail objects that match the criteria. Are you saying that
prior to doing this, I should iterate through them and do a:
photoThumbnail.setPhoto(null)
on each object meeting the criteria?
If this is what you're suggesting, this seems like a lot of work... Are
you saying that my object model is corrupt? Please explain what you
mean, perhaps by example, and what is "best practices" from a JDO
perspective.
Thanks,
Dan
Patrick Linskey wrote:
Dan,
Another better workaround would be to ensure that your object model is
consistent. That is, set the relation from PhotoThumbnail to Photo to
null. The reason that this bug is occuring is that we made the
assumption that your object model would be consistent.
That said, our cache will be patched shortly to be more forgiving
about this assumption. The patch will initially be deployed to 2.4,
and will then be back-ported to 2.3 at some point in the next weekor so.
-Patrick
Dan Finkelstein wrote:
Hi --
I just enabled caching in my single-JVM application. Now, when I
delete
an "photo", it gives me an exception. It appears like the object
deletion code goes through to commit successfully, and then subsequent
accesses to Kodo, give the exception. If I disable caching and do the
exact same sequence, no error occurs.
My code look like this:
Photo photo = (Photo)pm.getObjectById(photoId, false);
// first, delete any thumbnails...
Extent extent = pm.getExtent(PhotoThumbnail.class, false);
Query query = pm.newQuery(extent);
query.setFilter("photo == aPhoto");
query.declareParameters("Photo aPhoto");
Collection photosToDelete = (Collection)query.execute(photo);
pm.deletePersistentAll(photosToDelete);
// second, delete the photo itself
pm.deletePersistent(photo);
And there's the exception and trace...
500 Servlet Exception
javax.jdo.JDODataStoreException: The instance
"net.nearlythere.business.data.Photo-202"
does not exist in the data store.
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:864)
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:785)
at com.solarmetric.kodo.runtime.PCData.lookup(PCData.java:517)
at com.solarmetric.kodo.runtime.PCData.getData(PCData.java:493)
at com.solarmetric.kodo.runtime.PCData.load(PCData.java:210)
at com.solarmetric.kodo.runtime.PCData.load(PCData.java:112)
at
com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:221)
at
com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:112)
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:863)
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:785)
at com.solarmetric.kodo.runtime.PCData.lookup(PCData.java:517)
at com.solarmetric.kodo.runtime.PCData.getData(PCData.java:493)
at com.solarmetric.kodo.runtime.PCData.load(PCData.java:210)
at com.solarmetric.kodo.runtime.PCData.load(PCData.java:112)
at
com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.initialize(DataCacheStoreManager.java:221)
at
com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:112)
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter(PersistenceManagerImpl.java:863)
at
com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:768)
at
net.nearlythere.business.CoreSiteBuilder.getObjectById(CoreSiteBuilder.java:3450)
at
net.nearlythere.business.BaseBusiness.getSite(BaseBusiness.java:278)
at net.nearlythere.business.BaseBusiness.(BaseBusiness.java:138)
at
net.nearlythere.business.CoreSiteBuilder.(CoreSiteBuilder.java:80)
at
net.nearlythere.business.FactoryBusiness.newCore(FactoryBusiness.java:38)
at
net.nearlythere.frontend.controllers.site.Home.preDisplay(Home.java:61)
at
net.nearlythere.frontend.controllers.ControllerDisplay.perform(ControllerDisplay.java:29)
at
net.nearlythere.frontend.controllers.Controller.go(Controller.java:1126)
at org.infohazard.maverick.ctl.Throwaway2.go(Throwaway2.java:48)
at
org.infohazard.maverick.flow.ThrowawayControllerAdapter.go(ThrowawayControllerAdapter.java:58)
at org.infohazard.maverick.flow.CommandBase.go(CommandBase.java:41)
at org.infohazard.maverick.Dispatcher.service(Dispatcher.java:179)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
at
com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
at com.caucho.server.http.Invocation.service(Invocation.java:311)
at
com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:218)
at
com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:160)
at com.caucho.server.TcpConnection.run(TcpConnection.java:137)
at java.lang.Thread.run(Thread.java:536)
Resin 2.1.1 (built Mon May 13 16:53:21 PDT 2002)
Patrick Linskey [email protected]
SolarMetric Inc. http://www.solarmetric.com

Similar Messages

  • Datacache lock problems

    Hi,
    I am having problems when I use the datacache.
    I have set the following properties as explained in the manual:
    com.solarmetric.kodo.DataCacheClass:
    com.solarmetric.kodo.runtime.datacache.plugins.CacheImpl
    com.solarmetric.kodo.RemoteCommitProviderClass:
    com.solarmetric.kodo.runtime.event.impl.SingleJVMRemoteCommitProvider
    I have 11 threads in my code which do a mixture of reading and writing to
    the datastore. Each thread is passed it's own PM using
    JDOFactory.getPersistenceManager(). With the data cache on I seem to
    sometimes get all my threads locking. I dont understand why. Maybe someone
    can tell me what I'm doing wrong.
    Stack trace for one thread is:
    Object.wait(long) line: not available [native method]
    UpgradableReentrantWriterPreferenceRWL$UpgradableWriterLock(Object).wait()
    line: 426
    UpgradableReentrantWriterPreferenceRWL$UpgradableWriterLock(WriterPreferenceReadWriteLock$WriterLock).acquire()
    line: 249
    UpgradableReentrantWriterPreferenceRWL$UpgradableWriterLock.acquire()
    line: 83
    CacheImpl(AbstractCacheImpl).acquireWriteLock() line: 411
    TimedDataCache.acquireWriteLock() line: 268
    DataCacheStoreManager.commit() line: 270
    PersistenceManagerImpl.endTransaction(boolean) line: 796
    PersistenceManagerImpl.commit() line: 476
    TradeFactory.getTrade(PersistenceManager, ProductType, Currency, long,
    double, Date, Date) line: 50
    Another is:
    Object.wait(long) line: not available [native method]
    WriterPreferenceReadWriteLock$ReaderLock(Object).wait() line: 426 [local
    variables unavailable]
    WriterPreferenceReadWriteLock$ReaderLock.acquire() line: 169
    CacheImpl(AbstractCacheImpl).acquireReadLock() line: 384
    TimedDataCache.acquireReadLock() line: 256
    TimedDataCache.containsKey(Object) line: 176
    DataCacheStoreManager.exists(Object, ClassMetaData) line: 478
    PersistenceManagerImpl.getObjectByIdFilter(Object, Object, boolean,
    boolean, boolean) line: 1243
    PersistenceManagerImpl.getObjectById(Object, boolean) line: 1179
    CacheAwareQuery$CachedResultList.get(int) line: 432
    AbstractList$Itr.next() line: 416 [local variables unavailable]
    ProductFactory.getProduct(PersistenceManager, String) line: 43
    The other threads are all stopped on the following code
    Transaction tx = pm.currentTransaction();
    apart from one thread which is locked on iterating through an extent.
    Regards,
    Menno

    Can you post a full thread dump for all threads, including full class
    names etc., or send it to [email protected]?
    -Patrick
    On Tue, 02 Sep 2003 13:56:20 +0000, Menno wrote:
    Patrick Linskey wrote:
    Also, where is the extent-iteration lock happening?I'm running version 2.5.3 but it also happened with 2.5.2.
    The iteration lock is actually on a query.
    The stack is:
    CachingRandomAccessList.get(int) line: 139
    AbstractList$Itr.next() line: 416
    LimitFactory.getLimit(PersistenceManager, ProductType, Currency) line: 44
    The code is as follows:
              Transaction tx = pm.currentTransaction();
              tx.begin();
              String id = p.getProductname() + ":" + c.getName();
              String Filter = "name == id";
              Query q = pm.newQuery(Limit.class,Filter);
              q.declareParameters("String id");
              Collection res = (Collection) q.execute(id);
              Limit l = null;
              Iterator I = res.iterator();
              if( I.hasNext() )
                   l = (Limit)I.next(); // locks here
    ...more code--
    Patrick Linskey
    SolarMetric Inc.

  • Serious connection pool problem on Tomcat

    Hi,
    We are deploying our JSF creator-made app onto Tomcat 1.5. We set up our JNDI datasource on Tomcat (using the i-net driver ).
    Initially the pages load ok but after a short period of time we are getting these errors:
    Initialization Failure: javax.faces.FacesException: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool exhaustedWe believe that somehow the Creator-generated code is NOT freeing up connections in the connection pool.
    We think that when the afterRenderResponse() methods in the beans call rowset.close() this is NOT returning the connections to the pool. Can someone, hopefully a Sun Engineer confirm that the rowset.close() code in afterRenderResponse() returns the connection behind the rowset to the connection pool.
    Could this be a driver issue? We are using the i-net driver not the DataDirect one, but this should implement the full API.
    This is a very serious problem for us.
    regards,
    john

    do you have any example code you could post? I have a Spring/JSC tutorial on this forum. Just search for Spring and you should find it. It you need something more, I'll try to give you some help...time provided.
    am i
    right in thinking that you use the forms designer to
    lay out your pages and just put your own stuff in the
    bean constructor?Close...but not everything goes in the constructor.
    >
    One thing that may have caused a problem is we have
    just noticed that in one of our most commonly hit
    pages this line:
    dataTable1Model.setDataCacheKey("com.sun.datacache.my_
    page.my_rowset");
    featured the WRONG "my_page" jsp page but the correct
    rowset name "my_rowset". The page DID load correctly
    and run correctly, though. Could this cause problems
    with connection pooling? Anyone?I wouldn't think so, but it depends on how Creator builds the code.

  • Cache and/or Connection problems under load

    I have a Kodo web app that's been running just fine in
    production for many months now. However, recently the web
    traffic has shot up by a huge amount, literally overnight.
    But unfortunately, it's caused the app to fail very ungracefully
    under the strain.
    It's been a crazy few days, and I haven't been able to do
    very much analysis because of higher priorities. But from
    what I have been able to gleen, it now looks like Kodo is
    the most likely culprit. From what I've read in other messages
    here, it appears others may have been experiencing similar
    problems.
    My environment: Redhat Linux 8, Postgres 7.3.4 with the
    included JDBC3 driver, Apache 1.3.x, Tomcat 4.1.x and the
    webapp connector. Similar behavior was seen with Apache 2.x,
    Tomcat 4.1.x and the JK2 connector (that was on the new machine
    I setup to handle the new traffic, which, of course, died the
    night before).
    As I mentioned, this app has been running reliably for
    months with no problems. But when placed under heavy load,
    it appears to get into some sort of pathological state where
    it slows down dramatically (asymptotically?) to the point where
    it's effectively locked up. In one case, where the app was
    left running for several hours in this state, requests were
    taking 90 minutes to complete (normal is 1-5 seconds).
    From what I can deduce, there seem to be four things
    going on, three of which have been mentioned in recent threads
    here:
    1) Excessive memory consumption. When the app is
    operating normally, I see fairly flat memory usage for
    the JVM process. Under load, the JVM steadily expands
    until it hits its heap limit. I've gotten OutOfMemory
    exceptions with a heap size of 350MB, which should be plenty.
    2) Level 2 cache locking issues. I've seen dozens of
    threads waiting on a lock in the DataCache code. Not sure
    if there's a deadlock happening here or just that the
    threads are waiting on a lock that's being held for a long time.
    3) Database Connection leaks or contention. I see threads
    spinning in the DataSource code trying to get a connection.
    I also see dozens of connections from the Postgres side which
    seem to be sitting idle, but in the middle of a transaction.
    When things get bad, I also see exceptions being thrown because
    of timeouts waiting for a connection to become available. It's
    a web app, PMs should not be tied up for more than a few seconds.
    4) CPU usage pegged or nearly so for the JVM. I suspect
    this is related to #3. Something very bad is going on here.
    If I stop all inbound requests to the JVM when it's in this
    bad state, it will continue to burn CPU at 90%+ for a very
    long time. I think it will eventually finish what it's doing,
    but I haven't had the luxury of waiting for it. It's definitely
    not a linear slowdown proportional to the load.
    Attached are my kodo.properties file and some thread stack
    traces along with some comments. Any advice would be greatly
    appreciated. This is not a complicated app nor am I doing
    anything unusual. It doesn't seem logical that Kodo could
    breakdown so dramatically under load, so I'm hoping it's some
    sort of interaction thing that I can work around.
    Thanks.
    Ron Hitchens {mailto:[email protected]} RonSoft Technologies
    (510) 494-9597 (Home Office) http://www.ronsoft.com
    (707) 924-3878 (fax) Bit Twiddling At Its Finest
    "Born with a broken heart" -Kenny Wayne Shepard

    Please read prior posts regarding level 2 cache. It is unusable under stress
    as far I am concerned. Basically entire cache gets locked on any database
    read. Makes it very unscalable
    Are you using 2.5.3? It will request a connection from a pool every time it
    resolves reference to a PC even if it is cached in PM and therefore Kodo
    does not need to read any. As result if you iterate over 100 objects in your
    query and for each object resolve reference to another object (always the
    same) kodo will request 100 database connections from the pool (and note
    they issue rollback on every time they return a connection to the pool so
    getting connection might be fairly expensive)
    In conjunction with level 2 cache contention this causes application to go
    into a stupor.
    Try to go back to 2.5.2 (or may be 2.5.4 they promised in the near future
    with a workaround) or use "persistent-manager" connection retention if you
    discard PM after each HTTP invocation - it will take care of connection
    pooling issue. As far as L2 cache I was unable to find any work around so
    far - see if you might be better of without cache. You might if your object
    graph is not very complex
    "Ron Hitchens" <[email protected]> wrote in message
    news:[email protected]...
    >
    I have a Kodo web app that's been running just fine in
    production for many months now. However, recently the web
    traffic has shot up by a huge amount, literally overnight.
    But unfortunately, it's caused the app to fail very ungracefully
    under the strain.
    It's been a crazy few days, and I haven't been able to do
    very much analysis because of higher priorities. But from
    what I have been able to gleen, it now looks like Kodo is
    the most likely culprit. From what I've read in other messages
    here, it appears others may have been experiencing similar
    problems.
    My environment: Redhat Linux 8, Postgres 7.3.4 with the
    included JDBC3 driver, Apache 1.3.x, Tomcat 4.1.x and the
    webapp connector. Similar behavior was seen with Apache 2.x,
    Tomcat 4.1.x and the JK2 connector (that was on the new machine
    I setup to handle the new traffic, which, of course, died the
    night before).
    As I mentioned, this app has been running reliably for
    months with no problems. But when placed under heavy load,
    it appears to get into some sort of pathological state where
    it slows down dramatically (asymptotically?) to the point where
    it's effectively locked up. In one case, where the app was
    left running for several hours in this state, requests were
    taking 90 minutes to complete (normal is 1-5 seconds).
    From what I can deduce, there seem to be four things
    going on, three of which have been mentioned in recent threads
    here:
    1) Excessive memory consumption. When the app is
    operating normally, I see fairly flat memory usage for
    the JVM process. Under load, the JVM steadily expands
    until it hits its heap limit. I've gotten OutOfMemory
    exceptions with a heap size of 350MB, which should be plenty.
    2) Level 2 cache locking issues. I've seen dozens of
    threads waiting on a lock in the DataCache code. Not sure
    if there's a deadlock happening here or just that the
    threads are waiting on a lock that's being held for a long time.
    3) Database Connection leaks or contention. I see threads
    spinning in the DataSource code trying to get a connection.
    I also see dozens of connections from the Postgres side which
    seem to be sitting idle, but in the middle of a transaction.
    When things get bad, I also see exceptions being thrown because
    of timeouts waiting for a connection to become available. It's
    a web app, PMs should not be tied up for more than a few seconds.
    4) CPU usage pegged or nearly so for the JVM. I suspect
    this is related to #3. Something very bad is going on here.
    If I stop all inbound requests to the JVM when it's in this
    bad state, it will continue to burn CPU at 90%+ for a very
    long time. I think it will eventually finish what it's doing,
    but I haven't had the luxury of waiting for it. It's definitely
    not a linear slowdown proportional to the load.
    Attached are my kodo.properties file and some thread stack
    traces along with some comments. Any advice would be greatly
    appreciated. This is not a complicated app nor am I doing
    anything unusual. It doesn't seem logical that Kodo could
    breakdown so dramatically under load, so I'm hoping it's some
    sort of interaction thing that I can work around.
    Thanks.
    Ron Hitchens {mailto:[email protected]} RonSoft Technologies
    (510) 494-9597 (Home Office) http://www.ronsoft.com
    (707) 924-3878 (fax) Bit Twiddling At Its Finest
    "Born with a broken heart" -Kenny Wayne Shepard
    With cahce enabled, 2.5.3
    Here the app had recently slowed down and then effectively locked up.
    There where many outstanding web requests that were not receiving output.
    At this point most threads seemed to be waiting at the same location.
    There were a large number of active database connections and most of
    them had open transactions (according to pg_stat_activity). The app
    was not responding to any web requests.
    It would seem that db transactions had been started, then the thread
    got stuck for a long time on a synchronization lock in the cache lookup.
    Below are two randomly chosen thread stack dumps.
    Thread-72[1] where
    [1] java.lang.Object.wait (native method)
    [2] java.lang.Object.wait (Object.java:429)
    [3]oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock.acquir
    e (WriterPreferenceReadWriteLock.java:169)
    [4]com.solarmetric.kodo.runtime.datacache.AbstractCacheImpl.acquireReadLock
    (AbstractCacheImpl.java:384)
    [5]com.solarmetric.kodo.runtime.datacache.TimedDataCache.acquireReadLock
    (TimedDataCache.java:256)
    [6] com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:595)
    [7] com.solarmetric.kodo.runtime.StateManagerImpl.loadFields(StateManagerImpl.java:2,330)
    [8] com.solarmetric.kodo.runtime.StateManagerImpl.isLoaded(StateManagerImpl.java:897)
    [9] com.europeasap.data.City.jdoGetname (null)
    [10] com.europeasap.data.City.getName (City.java:39)
    [11] com.europeasap.form.CustomerBookingForm.populateDepartureCityInfo(CustomerBookingForm.java:922)
    [12] com.europeasap.form.CustomerBookingForm.onetimeInit(CustomerBookingForm.java:871)
    [13] com.europeasap.form.CustomerBookingForm.populatePackageInfo(CustomerBookingForm.java:880)
    [14] com.europeasap.action.CustomizeTrip.perform (CustomizeTrip.java:66)
    [15] org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1,787)
    [16] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1,586) [17]
    org.apache.struts.action.ActionServlet.doGet (ActionServlet.java:492)
    [18] javax.servlet.http.HttpServlet.service (HttpServlet.java:740)
    [19] javax.servlet.http.HttpServlet.service (HttpServlet.java:853)
    [20] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    [21] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    [22] org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    [23]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [24] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [25] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [26] org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    [27]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [28] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    [29]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [30] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [31] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [32] org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2,415)
    [33] org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    [34]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [35] org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    [36]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [37] org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    [38]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [39] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [40] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [41] org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    [42]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [43] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [44] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [45] org.apache.catalina.connector.warp.WarpRequestHandler.handle (null)
    [46] org.apache.catalina.connector.warp.WarpConnection.run (null)
    [47] java.lang.Thread.run (Thread.java:534)
    Thread-64[1] where
    [1] java.lang.Object.wait (native method)
    [2] java.lang.Object.wait (Object.java:429)
    [3]oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$ReaderLock.acquir
    e (WriterPreferenceReadWriteLock.java:169)
    [4]com.solarmetric.kodo.runtime.datacache.AbstractCacheImpl.acquireReadLock
    (AbstractCacheImpl.java:384)
    [5]com.solarmetric.kodo.runtime.datacache.TimedDataCache.acquireReadLock
    (TimedDataCache.java:256)
    [6] com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:595)
    [7] com.solarmetric.kodo.runtime.StateManagerImpl.loadField(StateManagerImpl.java:2,248)
    [8] com.solarmetric.kodo.runtime.StateManagerImpl.isLoaded(StateManagerImpl.java:899)
    [9] com.europeasap.data.HotelPrices.jdoGetseasonalPrices (null)
    [10] com.europeasap.data.HotelPrices.normalizeIndex(HotelPrices.java:113)
    [11] com.europeasap.data.HotelPrices.getCost (HotelPrices.java:45)
    [12] com.europeasap.logic.CostHelper.findLowestHotel(CostHelper.java:181)
    [13] com.europeasap.logic.CostHelper.computeBasePackageCost(CostHelper.java:297)
    [14] com.europeasap.logic.CostHelper.computeFinalPackageCost(CostHelper.java:246)
    [15] com.europeasap.form.CustomerBookingForm.updateDisplayCosts(CustomerBookingForm.java:1,440)
    [16] com.europeasap.form.CustomerBookingForm.updateCustomizeDisplayInfo(CustomerBookingForm.java:1,407)
    [17] com.europeasap.action.CustomizeTrip.perform (CustomizeTrip.java:68)
    [18] org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1,787)
    [19] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1,586) [20]
    org.apache.struts.action.ActionServlet.doGet (ActionServlet.java:492)
    [21] javax.servlet.http.HttpServlet.service (HttpServlet.java:740)
    [22] javax.servlet.http.HttpServlet.service (HttpServlet.java:853)
    [23] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    [24] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    [25] org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    [26]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [27] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [28] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [29] org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    [30]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [31] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    [32]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [33] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [34] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [35] org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2,415)
    [36] org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    [37]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [38] org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    [39]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [40] org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    [41]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [42] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [43] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [44] org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    [45]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [46] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [47] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [48] org.apache.catalina.connector.warp.WarpRequestHandler.handle (null)
    [49] org.apache.catalina.connector.warp.WarpConnection.run (null)
    [50] java.lang.Thread.run (Thread.java:534)
    while running slow, 2.5.3
    At this point, the app had been running several hours normally, then
    apparently slowed down and locked up while I was away. When looking
    at the app threads and database activity, everything appeared idle.
    No transactions seemed to be open in the db. But the app was not
    behaving normally. Web requests that did not make use of JDO worked
    fine (but slow). But requests that hit the db either blocked or were
    very slow to respond.
    Looking back at the log, there had been a large number of requests
    that threw exceptions because they could not get a connection within
    five seconds.
    Most threads were idle, waiting on read, but some were in the state
    shown by the following two stack dumps. Unlike the cache threads above,
    they did not seem to be waiting for a lock to be granted, they seemed
    to be spinning in the connection management code. Apparently trying
    to get a connection. I suspended and resumed the same thread repeatedly
    and it always seemd to be doing the same thing. Single stepping was
    very difficult because the debugger was slow to respond, apparently
    because of other threads also busy spinning.
    Postgres indicated that there where lots of connections open and
    that they were all idle, so there should not have been a shortage
    of connections in the pool. There are two mysteries here: 1) why
    can't this thread get a connection? and 2) Why is it busy spinning?
    Thread-56[1] where
    [1]com.solarmetric.datasource.PreparedStatementCache$CacheAwareConnection.prepa
    reStatement (PreparedStatementCache.java:184)
    [2]com.solarmetric.datasource.PreparedStatementCache$CacheAwareConnection.prepa
    reStatement (PreparedStatementCache.java:169)
    [3] com.solarmetric.datasource.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:199)
    [4]com.solarmetric.kodo.impl.jdbc.schema.dict.AbstractDictionary.isClosed
    (AbstractDictionary.java:1,912)
    [5]com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.getConnectionFromFact
    ory (SQLExecutionManagerImpl.java:186)
    [6] com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.getConnection(SQLExecutionManagerImpl.java:147)
    [7]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.newSQLExecutionManag
    er (JDBCStoreManager.java:828)
    [8]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.getSQLExecutionManag
    er (JDBCStoreManager.java:714)
    [9]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.getDatastoreConnecti
    on (JDBCStoreManager.java:287)
    [10]com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.getDatastoreCon
    nection (DataCacheStoreManager.java:465)
    [11] com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:591)
    [12] com.solarmetric.kodo.runtime.StateManagerImpl.loadFields(StateManagerImpl.java:2,330)
    [13] com.solarmetric.kodo.runtime.StateManagerImpl.isLoaded(StateManagerImpl.java:897)
    [14] com.europeasap.data.City.jdoGetname (null)
    [15] com.europeasap.data.City.getName (City.java:39)
    [16] com.europeasap.form.CustomerBookingForm.populateDepartureCityInfo(CustomerBookingForm.java:922)
    [17] com.europeasap.form.CustomerBookingForm.onetimeInit(CustomerBookingForm.java:871)
    [18] com.europeasap.form.CustomerBookingForm.populatePackageInfo(CustomerBookingForm.java:880)
    [19] com.europeasap.action.CustomizeTrip.perform (CustomizeTrip.java:66)
    [20] org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1,787)
    [21] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1,586) [22]
    org.apache.struts.action.ActionServlet.doGet (ActionServlet.java:492)
    [23] javax.servlet.http.HttpServlet.service (HttpServlet.java:740)
    [24] javax.servlet.http.HttpServlet.service (HttpServlet.java:853)
    [25] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    [26] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    [27] org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    [28]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [29] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [30] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [31] org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    [32]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [33] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    [34]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [35] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [36] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [37] org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2,415)
    [38] org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    [39]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [40] org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    [41]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [42] org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    [43]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [44] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [45] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [46] org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    [47]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [48] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [49] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [50] org.apache.catalina.connector.warp.WarpRequestHandler.handle (null)
    [51] org.apache.catalina.connector.warp.WarpConnection.run (null)
    [52] java.lang.Thread.run (Thread.java:534)
    Thread-56[1] where
    [1]com.solarmetric.datasource.DataSourceImpl$AbstractPool.findConnection
    (DataSourceImpl.java:826)
    [2] com.solarmetric.datasource.DataSourceImpl$AbstractPool.getConnection(DataSourceImpl.java:605)
    [3] com.solarmetric.datasource.DataSourceImpl.getConnection(DataSourceImpl.java:363)
    [4] com.solarmetric.datasource.DataSourceImpl.getConnection(DataSourceImpl.java:356)
    [5]com.solarmetric.kodo.impl.jdbc.runtime.DataSourceConnector.getConnection
    (DataSourceConnector.java:63)
    [6]com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.getConnectionFromFact
    ory (SQLExecutionManagerImpl.java:185)
    [7] com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.getConnection(SQLExecutionManagerImpl.java:147)
    [8]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.newSQLExecutionManag
    er (JDBCStoreManager.java:828)
    [9]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.getSQLExecutionManag
    er (JDBCStoreManager.java:714)
    [10]com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.getDatastoreConnecti
    on (JDBCStoreManager.java:287)
    [11]com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.getDatastoreCon
    nection (DataCacheStoreManager.java:465)
    [12]com.solarmetric.kodo.runtime.datacache.DataCacheStoreManager.initialize
    (DataCacheStoreManager.java:519)
    [13] com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:215)
    [14]com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter
    (PersistenceManagerImpl.java:1,278)
    [15] com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:1,179)
    [16]com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery$CachedResultLis
    t.get (CacheAwareQuery.java:432)
    [17] java.util.AbstractList$Itr.next (AbstractList.java:421)
    [18] com.europeasap.form.CustomerBookingForm.populateDepartureCityInfo(CustomerBookingForm.java:919)
    [19] com.europeasap.form.CustomerBookingForm.onetimeInit(CustomerBookingForm.java:871)
    [20] com.europeasap.form.CustomerBookingForm.populatePackageInfo(CustomerBookingForm.java:880)
    [21] com.europeasap.action.CustomizeTrip.perform (CustomizeTrip.java:66)
    [22] org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1,787)
    [23] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1,586) [24]
    org.apache.struts.action.ActionServlet.doGet (ActionServlet.java:492)
    [25] javax.servlet.http.HttpServlet.service (HttpServlet.java:740)
    [26] javax.servlet.http.HttpServlet.service (HttpServlet.java:853)
    [27] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    [28] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    [29] org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    [30]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [31] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [32] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [33] org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    [34]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [35] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    [36]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [37] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [38] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [39] org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2,415)
    [40] org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    [41]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [42] org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    [43]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [44] org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    [45]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:641)
    [46] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [47] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [48] org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    [49]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [50] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [51] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [52] org.apache.catalina.connector.warp.WarpRequestHandler.handle (null)
    [53] org.apache.catalina.connector.warp.WarpConnection.run (null)
    [54] java.lang.Thread.run (Thread.java:534)
    With cache disabled 2.4.3
    This run was an accident. I inadvertently ran the app with the older
    2.4.3 version of Kodo, with the cache disabled. This one got into trouble
    almost immediately. It also seemed to lockup with lots of opentransactions
    in the db. It's also interesting that these two threads also seem to be
    hanging around the same method as in 2.5.3.
    Thread-63[1] where 0x9f9
    [1]com.solarmetric.datasource.PreparedStatementCache$CacheAwareConnection.prepa
    reStatement (PreparedStatementCache.java:184)
    [2] com.solarmetric.datasource.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:377)
    [3]com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.prepareStatementInter
    nal (SQLExecutionManagerImpl.java:807)
    [4]com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.executePreparedQueryI
    nternal (SQLExecutionManagerImpl.java:761)
    [5]com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.executeQueryInternal
    (SQLExecutionManagerImpl.java:691)
    [6] com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.executeQuery(SQLExecutionManagerImpl.java:372)
    [7] com.solarmetric.kodo.impl.jdbc.SQLExecutionManagerImpl.executeQuery(SQLExecutionManagerImpl.java:356)
    [8] com.solarmetric.kodo.impl.jdbc.ormapping.ClassMapping.loadByPK(ClassMapping.java:950)
    [9] com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.initialize(JDBCStoreManager.java:263)
    [10] com.solarmetric.kodo.runtime.StateManagerImpl.loadInitialState(StateManagerImpl.java:174)
    [11]com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectByIdFilter
    (PersistenceManagerImpl.java:1,023)
    [12] com.solarmetric.kodo.runtime.PersistenceManagerImpl.getObjectById(PersistenceManagerImpl.java:942)
    [13] com.solarmetric.kodo.impl.jdbc.ormapping.OneToOneMapping.load(OneToOneMapping.java:147)
    [14] com.solarmetric.kodo.impl.jdbc.runtime.JDBCStoreManager.load(JDBCStoreManager.java:375)
    [15] com.solarmetric.kodo.runtime.StateManagerImpl.loadField(StateManagerImpl.java:2,035)
    [16] com.solarmetric.kodo.runtime.StateManagerImpl.isLoaded(StateManagerImpl.java:720)
    [17] com.europeasap.data.CityMarkup.jdoGetcity (null)
    [18] com.europeasap.data.CityMarkup.getCity (CityMarkup.java:30)
    [19] com.europeasap.logic.CostHelper.getCityMarkup (CostHelper.java:81)
    [20] com.europeasap.logic.CostHelper.computeBasePackageCost(CostHelper.java:289)
    [21] com.europeasap.logic.CostHelper.computeFinalPackageCost(CostHelper.java:246)
    [22] com.europeasap.form.CustomerBookingForm.updateDisplayCosts(CustomerBookingForm.java:1,440)
    [23] com.europeasap.form.CustomerBookingForm.updateCustomizeDisplayInfo(CustomerBookingForm.java:1,407)
    [24] com.europeasap.action.CustomizeTrip.perform (CustomizeTrip.java:68)
    [25] org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1,787)
    [26] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1,586) [27]
    org.apache.struts.action.ActionServlet.doPost (ActionServlet.java:510)
    [28] javax.servlet.http.HttpServlet.service (HttpServlet.java:760)
    [29] javax.servlet.http.HttpServlet.service (HttpServlet.java:853)
    [30] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    [31] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    [32] org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    [33]org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invok
    eNext (StandardPipeline.java:643)
    [34] org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    [35] org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    [36] org.apache.catal

  • Problems with data cache plugin - The ResultList has been closed

    I'm testing out the data cache to see if it helps some of my performance
    problems, but I now get lots of exceptions that I didn't get before I
    enabled the cache. Here's how I enabled it:
    # CACHE
    com.solarmetric.kodo.DataCacheClass=com.solarmetric.kodo.runtime.datacache.p
    lugins.CacheImpl
    com.solarmetric.kodo.RemoteCommitProviderClass=com.solarmetric.kodo.runtime.
    event.impl.SingleJVMRemoteCommitProvider
    The exception I'm getting follows. I'm curious if anyone has any insight
    into what's going on? I'm sure there is a problem with my code, I'm
    forgetting to close something or other but since it works fine without the
    cache I'm really stuck as to what it is.
    Thanks
    Michael
    22:17:32,792 ERROR ObjectFinder - Exception =
    com.solarmetric.kodo.runtime.FatalUserException: The ResultList has been
    closed.
    NestedThrowables:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held in
    embedded stack trace.
    com.solarmetric.kodo.runtime.FatalUserException: The ResultList has been
    closed.
    NestedThrowables:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held in
    embedded stack trace.
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.checkClosed(Eage
    rResultList.java:66)
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.get(EagerResultL
    ist.java:84)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.get(Cac
    hingRandomAccessList.java:124)
    at java.util.AbstractList$Itr.next(AbstractList.java:416)
    at java.util.AbstractList.equals(AbstractList.java:604)
    at serp.util.WeakCollection$WeakValue.equals(WeakCollection.java:123)
    at java.util.HashMap.eq(HashMap.java:270)
    at java.util.HashMap.removeEntryForKey(HashMap.java:525)
    at java.util.HashMap.remove(HashMap.java:507)
    at java.util.HashSet.remove(HashSet.java:198)
    at serp.util.RefValueCollection.removeFilter(RefValueCollection.java:272)
    at serp.util.RefValueCollection.remove(RefValueCollection.java:235)
    at
    com.solarmetric.kodo.runtime.datacache.query.QueryCacheImpl.unregisterClassC
    hangeListener(QueryCacheImpl.java:160)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.abortCa
    ching(CachingRandomAccessList.java:103)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.get(Cac
    hingRandomAccessList.java:149)
    at java.util.AbstractList$Itr.next(AbstractList.java:416)
    at java.util.AbstractList.hashCode(AbstractList.java:624)
    at serp.util.WeakCollection$WeakValue.<init>(WeakCollection.java:93)
    at serp.util.WeakCollection.createRefValue(WeakCollection.java:64)
    at serp.util.RefValueCollection.addFilter(RefValueCollection.java:193)
    at serp.util.RefValueCollection.add(RefValueCollection.java:166)
    at serp.util.RefValueCollection.add(RefValueCollection.java:157)
    at
    com.solarmetric.kodo.runtime.datacache.query.QueryCacheImpl.registerClassCha
    ngeListener(QueryCacheImpl.java:151)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.<init>(
    CachingRandomAccessList.java:76)
    at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.wrapList(CacheA
    wareQuery.java:146)
    at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.execute(CacheAw
    areQuery.java:270)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getObjects(ObjectFinder.java
    :62)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getObject(ObjectFinder.java:
    44)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getRole(ObjectFinder.java:91
    at
    com.verideon.veriguard.services.VeriguardService.createCustomerAccount(Verig
    uardService.java:210)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.createTestUser(
    TestVeriguardServiceMonitors.java:133)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.setUp(TestVerig
    uardServiceMonitors.java:80)
    at junit.framework.TestCase.runBare(TestCase.java:125)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
    nner.java:392)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.
    java:276)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner
    ..java:167)
    NestedThrowablesStackTrace:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held in
    embedded stack trace.
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.close(EagerResul
    tList.java:78)
    at com.solarmetric.kodo.impl.jdbc.query.JDBCQuery.close(JDBCQuery.java:127)
    at com.solarmetric.kodo.query.QueryImpl.closeAll(QueryImpl.java:637)
    at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.closeAll(CacheA
    wareQuery.java:343)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.closeQueries(Persistence
    ManagerImpl.java:934)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.close(PersistenceManager
    Impl.java:914)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.close(PersistenceManager
    Impl.java:884)
    at com.verideon.veriguard.services.PMService.close(PMService.java:120)
    at com.verideon.veriguard.services.PMService.close(PMService.java:111)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.deleteTestUser(
    TestVeriguardServiceMonitors.java:127)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.tearDown(TestVe
    riguardServiceMonitors.java:103)
    at junit.framework.TestCase.runBare(TestCase.java:130)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
    nner.java:392)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.
    java:276)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner
    ..java:167)

    Michael,
    Could you send your test case to [email protected] so that we
    can take a look at what's going on to cause this exception?
    Thanks,
    -Patrick
    On Thu, 22 May 2003 17:18:50 -0400, Michael wrote:
    I'm testing out the data cache to see if it helps some of my performance
    problems, but I now get lots of exceptions that I didn't get before I
    enabled the cache. Here's how I enabled it:
    # CACHE
    com.solarmetric.kodo.DataCacheClass=com.solarmetric.kodo.runtime.datacache.p
    lugins.CacheImpl
    com.solarmetric.kodo.RemoteCommitProviderClass=com.solarmetric.kodo.runtime.
    event.impl.SingleJVMRemoteCommitProvider
    The exception I'm getting follows. I'm curious if anyone has any
    insight into what's going on? I'm sure there is a problem with my code,
    I'm forgetting to close something or other but since it works fine
    without the cache I'm really stuck as to what it is.
    Thanks
    Michael
    22:17:32,792 ERROR ObjectFinder - Exception =
    com.solarmetric.kodo.runtime.FatalUserException: The ResultList has been
    closed.
    NestedThrowables:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held
    in embedded stack trace.
    com.solarmetric.kodo.runtime.FatalUserException: The ResultList has been
    closed.
    NestedThrowables:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held
    in embedded stack trace.
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.checkClosed(Eage
    rResultList.java:66)
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.get(EagerResultL
    ist.java:84)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.get(Cac
    hingRandomAccessList.java:124)
    at java.util.AbstractList$Itr.next(AbstractList.java:416) at
    java.util.AbstractList.equals(AbstractList.java:604) at
    serp.util.WeakCollection$WeakValue.equals(WeakCollection.java:123) at
    java.util.HashMap.eq(HashMap.java:270) at
    java.util.HashMap.removeEntryForKey(HashMap.java:525) at
    java.util.HashMap.remove(HashMap.java:507) at
    java.util.HashSet.remove(HashSet.java:198) at
    serp.util.RefValueCollection.removeFilter(RefValueCollection.java:272)
    at serp.util.RefValueCollection.remove(RefValueCollection.java:235) at
    com.solarmetric.kodo.runtime.datacache.query.QueryCacheImpl.unregisterClassC
    hangeListener(QueryCacheImpl.java:160)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.abortCa
    ching(CachingRandomAccessList.java:103)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.get(Cac
    hingRandomAccessList.java:149)
    at java.util.AbstractList$Itr.next(AbstractList.java:416) at
    java.util.AbstractList.hashCode(AbstractList.java:624) at
    serp.util.WeakCollection$WeakValue.<init>(WeakCollection.java:93) at
    serp.util.WeakCollection.createRefValue(WeakCollection.java:64) at
    serp.util.RefValueCollection.addFilter(RefValueCollection.java:193) at
    serp.util.RefValueCollection.add(RefValueCollection.java:166) at
    serp.util.RefValueCollection.add(RefValueCollection.java:157) at
    com.solarmetric.kodo.runtime.datacache.query.QueryCacheImpl.registerClassCha
    ngeListener(QueryCacheImpl.java:151)
    at
    com.solarmetric.kodo.runtime.datacache.query.CachingRandomAccessList.<init>(
    CachingRandomAccessList.java:76)
    at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.wrapList(CacheA
    wareQuery.java:146)
    at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.execute(CacheAw
    areQuery.java:270)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getObjects(ObjectFinder.java
    :62)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getObject(ObjectFinder.java:
    44)
    at
    com.verideon.veriguard.persistence.ObjectFinder.getRole(ObjectFinder.java:91
    at
    com.verideon.veriguard.services.VeriguardService.createCustomerAccount(Verig
    uardService.java:210)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.createTestUser(
    TestVeriguardServiceMonitors.java:133)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.setUp(TestVerig
    uardServiceMonitors.java:80)
    at junit.framework.TestCase.runBare(TestCase.java:125) at
    junit.framework.TestResult$1.protect(TestResult.java:106) at
    junit.framework.TestResult.runProtected(TestResult.java:124) at
    junit.framework.TestResult.run(TestResult.java:109) at
    junit.framework.TestCase.run(TestCase.java:118) at
    junit.framework.TestSuite.runTest(TestSuite.java:208) at
    junit.framework.TestSuite.run(TestSuite.java:203) at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
    nner.java:392)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.
    java:276)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner
    .java:167)
    NestedThrowablesStackTrace:
    com.solarmetric.kodo.runtime.ClosurePoint: Closure point of object held
    in embedded stack trace.
    at
    com.solarmetric.kodo.runtime.objectprovider.EagerResultList.close(EagerResul
    tList.java:78)
    at
    com.solarmetric.kodo.impl.jdbc.query.JDBCQuery.close(JDBCQuery.java:127)
    at com.solarmetric.kodo.query.QueryImpl.closeAll(QueryImpl.java:637) at
    com.solarmetric.kodo.runtime.datacache.query.CacheAwareQuery.closeAll(CacheA
    wareQuery.java:343)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.closeQueries(Persistence
    ManagerImpl.java:934)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.close(PersistenceManager
    Impl.java:914)
    at
    com.solarmetric.kodo.runtime.PersistenceManagerImpl.close(PersistenceManager
    Impl.java:884)
    at com.verideon.veriguard.services.PMService.close(PMService.java:120)
    at com.verideon.veriguard.services.PMService.close(PMService.java:111)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.deleteTestUser(
    TestVeriguardServiceMonitors.java:127)
    at
    com.verideon.veriguard.services.TestVeriguardServiceMonitors.tearDown(TestVe
    riguardServiceMonitors.java:103)
    at junit.framework.TestCase.runBare(TestCase.java:130) at
    junit.framework.TestResult$1.protect(TestResult.java:106) at
    junit.framework.TestResult.runProtected(TestResult.java:124) at
    junit.framework.TestResult.run(TestResult.java:109) at
    junit.framework.TestCase.run(TestCase.java:118) at
    junit.framework.TestSuite.runTest(TestSuite.java:208) at
    junit.framework.TestSuite.run(TestSuite.java:203) at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
    nner.java:392)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.
    java:276)
    at
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner
    .java:167)--
    Patrick Linskey
    SolarMetric Inc.

  • Problem of use postgre in jcl

    I add a new datasource type for postgre ,and try to bind a table to datatable tag,but it does not work.
    jcl just created only 3 rows java codes like :
                tmamailtoRowSet.setDataSourceName("java:comp/env/jdbc/datasource1");
                tmamailtoRowSet.setCommand("SELECT * FROM public.tmamailto");
                dataTable1Model.setDataCacheKey("com.sun.datacache.Page1.tmamailtoRowSet");look forward to your help

    I want that answerActually there's already a forum topic on it: http://swforum.sun.com/jive/thread.jspa?forumID=123&threadID=47883
    I have a function in my SessionBean1 that connects to my db.
    ============================
    SessionBean1.getConnection()
    ============================
    //javax.naming.InitialContext ctx = new javax.naming.InitialContext();
    public Connection getConnection() {
    /* Init shared resources */
    try {
    Context initCtx = new InitialContext();
    DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/BDPA_DB");
    dbCon = ds.getConnection();
    catch (NamingException e) {
    java.lang.System.out.println(
    "A problem occurred while retrieving a DataSource object");
    java.lang.System.out.println(e.toString());
    catch (SQLException e) {
    java.lang.System.out.println(
    "A problem occurred while connecting to the database.");
    java.lang.System.out.println(e.toString());
    return dbCon;
    //javax.sql.DataSource datasource = (javax.sql.DataSource) ctx.lookup(getAppDataSource());
    }

  • Performance problem with synchronized singleton

    I'm using the singleton pattern to cache incoming JMS Message data from a 3rd party. I'm seeing terrible performance though, and I think it's because I've misunderstood something.
    My singleton class stores incoming JMS messages in a HashMap, so that successive messages can be checked to see if they are a new piece of data, or an update to an earlier one.
    I followed the traditional examples of a private constructor and a public getInstance method, and applied the double-checked locking to the latter. However, a colleague then suggested that all my other methods in the same class should also be synchronized - is this the case or am I creating an unnecessary performance bottleneck? Or have I unwittingly created that bottleneck elsewhere?
    package com.mycode;
    import java.util.HashMap;
    import java.util.Iterator;
    public class DataCache {
        private volatile static DataCache uniqueInstance;
        private HashMap<String, DataCacheElement> dataCache;
        private DataCache() {
            if (dataCache == null) {
                dataCache = new HashMap<String, DataCacheElement>();
        public static DataCache getInstance() {
             if (uniqueInstance == null) {
                synchronized  (DataCache.class) {
                    if (uniqueInstance == null) {
                        uniqueInstance = new DataCache();
            return uniqueInstance;
        public synchronized void put(String uniqueID, DataCacheElement dataCacheElement) {
            dataCache.put(uniqueID, dataCacheElement);
        public synchronized DataCacheElement get(String uniqueID) {
            DataCacheElement dataCacheElement = (DataCacheElement) dataCache.get(uniqueID);
            return dataCacheElement;
        public synchronized void remove(String uniqueID) {
            dataCache.remove(uniqueID);
        public synchronized int getCacheSize() {
         return dataCache.keySet().size();
         * Flushes all objects from the cache that are older than the
         * expiry time.
         * @param expiryTime (long milliseconds)
        public synchronized void flush(long expiryTime) {
            String uniqueID;
            long currentDate = System.currentTimeMillis();
            long compareDate = currentDate - (expiryTime);
            Iterator<String> iterator = dataCache.keySet().iterator();
            while( iterator.hasNext() ){
                // Get element by unique key
                uniqueID = (String) iterator.next();
                DataCacheElement dataCacheElement = (DataCacheElement) get(uniqueID);
                // get time from element
                long lastUpdatedDate = dataCacheElement.getUpdatedDate();
                // if time is greater than 1 day, remove element from cache
                if (lastUpdatedDate <  compareDate) {
                    remove(uniqueID);
        public synchronized void empty() {
            dataCache.clear();
    }

    m0thr4 wrote:
    SunFred wrote:
    m0thr4 wrote:
    I [...] applied the double-checked locking
    Which is broken. http://www.ibm.com/developerworks/java/library/j-dcl.html
    from the link:
    The theory behind double-checked locking is perfect. Unfortunately, reality is entirely different. The problem with double-checked locking is that there is no guarantee it will work on single or multi-processor machines.
    The issue of the failure of double-checked locking is not due to implementation bugs in JVMs but to the current Java platform memory model. The memory model allows what is known as "out-of-order writes" and is a prime reason why this idiom fails[b].
    I had a read of that article and have a couple of questions about it:
    1. The article was written way back in May 2002 - is the issue they describe relevant to Java 6's memory model? DCL will work starting with 1.4 or 1.5, if you make the variable you're testing volatile. However, there's no reason to do it.
    Lazy instantiation is almost never appropriate, and for those rare times when it is, use a nested class to hold your instance reference. (There are examples if you search for them.) I'd be willing to be lazy instantiation is no appropriate in your case, so you don't need to muck with syncing or DCL or any of that nonsense.

  • Externalization and datacache

    Hi,
    i have a problem with the externalization framework and the datacache:
    My persistence class 'A' has a field 'f' of custom type that have
    references to other persistent objects.
    This field is stored using the externalization framework and my factory
    method receives the persistence manager instance associated to the A
    instance.
    I'm getting an existing instance of A from a new persistence manager (with
    the PersistenceManager getObjectById method). When the instance is already
    present in the datacache,
    the factory method is not called and my field f contains references to
    persistent objects associated to another persistence manager (the one i
    used when i first access the instance).
    It works fine when my instance of A are not already in the datacache since
    the factory method is called and the references are retrieved from the
    current persistence manager.
    Tell me if i miss somthing in the framework or if there is a workaround.
    I've tested it with versions 3.0.3 and 3.1rc2. I'm using Kodo in Stateless
    Session Beans and get a persistence manager in each bean method as
    suggested in the documentation.
    Thanks for your help
    Laurent Czinczenheim

    Well, one solution (if you can call it that) is to just disable data
    caching for the class that owns the externalized field:
    <class name="XXX">
    <extension vendor-name="kodo" key="data-cache" value="false"/>
    </class>
    Other than that, I can't think of any workarounds.

  • Reset datacache without DB restart

    Hello!
    Is there a possibility to reset the cache of a MaxDB using some command?
    I a investigating an I/O Problem and need to generate I/O on the disksystem. Therefore I have to reset the datacache before creating DB load.
    I tried the x_cons command pagecache_refresh but for some reason it didn't work:
    x_cons ASC PAGECACHE_RELEASE
    ERR 11987  CONSOLE  unknown command: 'PAGECACHE_RELEASE'
    Any Idea?
    Thanks for your help!

    Hi Bernd,
    nope, no way.
    Sorry,
    Steffen

  • DataCache NPE with generation strategy=IDENTITY

    When I try to persist an entity whose ID is generated with the JPA IDENTITY strategy, everything works fine except a NPE is thrown when trying to cache the newly persisted entity. Disabling the DataCache fixes the problem.
    java.lang.NullPointerException: null keys not allowed
    at com.solarmetric.apache.commons.collections.map.AbstractReferenceMap.put(AbstractReferenceMap.java:248)
    at com.solarmetric.util.EfficientEmptyReferenceMap.put(EfficientEmptyReferenceMap.java:43)
    at com.solarmetric.apache.commons.collections.set.MapBackedSet.add(MapBackedSet.java:110)
    at com.solarmetric.util.ReferenceSet.add(ReferenceSet.java:59)
    at kodo.datacache.ClassRefCacheMap.entryAdded(ClassRefCacheMap.java:136)
    at kodo.util.CacheMap.put(CacheMap.java:402)
    at kodo.datacache.DataCacheImpl.putInternal(DataCacheImpl.java:109)
    at kodo.datacache.AbstractDataCache.putAllInternal(AbstractDataCache.java:420)
    at kodo.datacache.AbstractDataCache.commit(AbstractDataCache.java:98)
    at kodo.datacache.DataCacheStoreManager.updateCaches(DataCacheStoreManager.java:222)
    at kodo.datacache.DataCacheStoreManager.commit(DataCacheStoreManager.java:66)
    at kodo.kernel.DelegatingStoreManager.commit(DelegatingStoreManager.java:98)
    at kodo.kernel.BrokerImpl.endStoreManagerTransaction(BrokerImpl.java:1484)
    at kodo.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2536)
    at kodo.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:2182)
    at kodo.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:85)
    at kodo.kernel.BrokerImpl.commit(BrokerImpl.java:1546)
    at kodo.kernel.DelegatingBroker.commit(DelegatingBroker.java:1250)
    at kodo.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:451)
    at figbird.cms.application.DAO.getRootItem(DAO.java:160)
    The stack trace shows that the entity is INSERTed and it's id fetched, but it seems that somehow this identity is not being set property:
    FINEST: <t 2791549, conn 26179329> [2 ms] executing prepstmnt 10891966 INSERT INTO FB_PRIVILEGES (comment, inheritable, level, role, type, username, item_uuid) VALUES (?, ?, ?, ?, ?, ?, ?) [params=(null) null, (boolean) true, (int) 200, (String) *, (String) *, (String) *, (long) 1] [reused=2]
    Jun 30, 2006 11:38:48 AM com.solarmetric.log.CommonsLogFactory$LogAdapter trace
    FINEST: <t 2791549, conn 26179329> [47 ms] executing prepstmnt 21849501 SELECT CURRVAL('FB_PRIVILEGES_id_SEQ') [reused=2]
    Ninth Avenue Software
    http://www.ninthavenue.com.au

    I can reproduce this behaviour with application-identity and autoassign value-strategy. Disabling the DataCache fixes the problem here, too.
    however, calling the getter of a newly persisted Objekt's id, or doing a query, both BEFORE i commit the transaction, fixes the problem also.
    This happens both for kodo 4.0.0 and 4.0.1

  • A problem with threads

    I am trying to implement some kind of a server listening for requests. The listener part of the app, is a daemon thread that listens for connections and instantiates a handling daemon thread once it gets some. However, my problem is that i must be able to kill the listening thread at the user's will (say via a sto button). I have done this via the Sun's proposed way, by testing a boolean flag in the loop, which is set to false when i wish to kill the thread. The problem with this thing is the following...
    Once the thread starts excecuting, it will test the flag, find it true and enter the loop. At some point it will LOCK on the server socket waiting for connection. Unless some client actually connects, it will keep on listening indefinatelly whithought ever bothering to check for the flag again (no matter how many times you set the damn thing to false).
    My question is this: Is there any real, non-theoretical, applied way to stop thread in java safely?
    Thank you in advance,
    Lefty

    This was one solution from the socket programming forum, have you tried this??
    public Thread MyThread extends Thread{
         boolean active = true;          
         public void run(){
              ss.setSoTimeout(90);               
              while (active){                   
                   try{                       
                        serverSocket = ss.accept();
                   catch (SocketTimeoutException ste){
                   // do nothing                   
         // interrupt thread           
         public void deactivate(){               
              active = false;
              // you gotta sleep for a time longer than the               
              // accept() timeout to make sure that timeout is finished.               
              try{
                   sleep(91);               
              }catch (InterruptedException ie){            
              interrupt();
    }

  • A problem with Threads and MMapi

    I am tring to execute a class based on Game canvas.
    The problem begin when I try to Play both a MIDI tone and to run an infinit Thread loop.
    The MIDI tone "Stammers".
    How to over come the problem?
    Thanks in advance
    Kobi
    See Code example below:
    import java.io.IOException;
    import java.io.InputStream;
    import javax.microedition.lcdui.Graphics;
    import javax.microedition.lcdui.Image;
    import javax.microedition.lcdui.game.GameCanvas;
    import javax.microedition.media.Manager;
    import javax.microedition.media.MediaException;
    import javax.microedition.media.Player;
    public class MainScreenCanvas extends GameCanvas implements Runnable {
         private MainMIDlet parent;
         private boolean mTrucking = false;
         Image imgBackgound = null;
         int imgBackgoundX = 0, imgBackgoundY = 0;
         Player player;
         public MainScreenCanvas(MainMIDlet parent)
              super(true);
              this.parent = parent;
              try
                   imgBackgound = Image.createImage("/images/area03_bkg0.png");
                   imgBackgoundX = this.getWidth() - imgBackgound.getWidth();
                   imgBackgoundY = this.getHeight() - imgBackgound.getHeight();
              catch(Exception e)
                   System.out.println(e.getMessage());
          * starts thread
         public void start()
              mTrucking = true;
              Thread t = new Thread(this);
              t.start();
          * stops thread
         public void stop()
              mTrucking = false;
         public void play()
              try
                   InputStream is = getClass().getResourceAsStream("/sounds/scale.mid");
                   player = Manager.createPlayer(is, "audio/midi");
                   player.setLoopCount(-1);
                   player.prefetch();
                   player.start();
              catch(Exception e)
                   System.out.println(e.getMessage());
         public void run()
              Graphics g = getGraphics();
              play();
              while (true)
                   tick();
                   input();
                   render(g);
          * responsible for object movements
         private void tick()
          * response to key input
         private void input()
              int keyStates = getKeyStates();
              if ((keyStates & LEFT_PRESSED) != 0)
                   imgBackgoundX++;
                   if (imgBackgoundX > 0)
                        imgBackgoundX = 0;
              if ((keyStates & RIGHT_PRESSED) != 0)
                   imgBackgoundX--;
                   if (imgBackgoundX < this.getWidth() - imgBackgound.getWidth())
                        imgBackgoundX = this.getWidth() - imgBackgound.getWidth();
          * Responsible for the drawing
          * @param g
         private void render(Graphics g)
              g.drawImage(imgBackgound, imgBackgoundX, imgBackgoundY, Graphics.TOP | Graphics.LEFT);
              this.flushGraphics();
    }

    You can also try to provide a greater Priority to your player thread so that it gains the CPU time when ever it needs it and don't harm the playback.
    However a loop in a Thread and that to an infinite loop is one kind of very bad programming, 'cuz the loop eats up most of your CPU time which in turn adds up more delays of the execution of other tasks (just as in your case it is the playback). By witting codes bit efficiently and planning out the architectural execution flow of the app before start writing the code helps solve these kind of issues.
    You can go through [this simple tutorial|http://oreilly.com/catalog/expjava/excerpt/index.html] about Basics of Java and Threads to know more about threads.
    Regds,
    SD
    N.B. And yes there are more articles and tutorials available but much of them targets the Java SE / EE, but if you want to read them here is [another great one straight from SUN|http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html] .
    Edited by: find_suvro@SDN on 7 Nov, 2008 12:00 PM

  • J2ME problem with threads

    Hi all,
    I would like to ask you for a help. I need to write a small program at my university. I started to write a midlet which function would be to countdown time for sports activities. I woul like to start a new thread - the one that counts down - and at the same time make the main thread sleep. After the "countdown" thread finishes, the main thread wakes up and waits for user input. The problem is that when the "countdown" thread finishes his work, I've got Uncaught exception java/lang/NullPointerException. error and the midlet halts.
    Below you can find the code
    import java.lang.*;
    import java.util.*;
    import javax.microedition.lcdui.*;
    import javax.microedition.midlet.*;
    public class intervals extends MIDlet implements CommandListener
    public Display ekran;
    private SweepCanvas sweeper;
    private Form rundy;
    private TextField round0, round1, round2, round3, round4, round5, round6, round7, round8;
    private long czas,x;
    private Command exitCommand;
    private Command addRound;
    private Command delRound;
    private Command start;
    private TextField repeat;
    private Form odliczanie;
    private Alert ostrz;
    Licznik thread;
    String test;
    StringItem test1;
    int parz,i,j,k;
    static int l;
    int ilrund;
    int ilpowt;
    Item sec;
    long sec1;
    public intervals()
        rundy = new Form("Interwa&#322;y sportowe");
        exitCommand = new Command("Wyj&#347;cie", Command.EXIT, 2);
        addRound = new Command("Dodaj","Dodaj rund&#281;", Command.ITEM,1);
        delRound = new Command("Usu&#324;","Usu&#324; ostatni&#261; rund&#281;", Command.ITEM,1);
        start = new Command("Start", Command.ITEM,1);
        odliczanie = new Form("Odliczanie");
        TextField dodaj(TextField kolej)
            kolej=new TextField("Podaj czas (s) rundy "+parz,null, 4, TextField.NUMERIC);//stworzenie nowej instancji do wybierania czasu trwania rundy
            if(rundy.size()==0)
                rundy.insert(rundy.size(),kolej);
                else
                    rundy.insert(rundy.size()-1, kolej);
            return kolej;
        void odliczanie(TextField round)
            monitor m=new monitor();
            k=Integer.parseInt(round.getString());
            ekran.setCurrent(odliczanie);
            thread=new Licznik(k,odliczanie);
            thread.start();
            ekran.setCurrent(rundy);
    public void startApp()// throws MIDletStateChangeException
        rundy.deleteAll();
        repeat = new TextField("Podaj ilo&#347;&#263; powtórze&#324;",null,1,TextField.NUMERIC);
        rundy.addCommand(addRound);
        rundy.addCommand(exitCommand);
        rundy.setCommandListener(this);
        Canvas obrazek = new MyCanvas();
        ekran = Display.getDisplay(this);
        ekran.setCurrent(obrazek);
        czas=System.currentTimeMillis();
        while (System.currentTimeMillis()<czas+1000)
            continue;
        ekran.setCurrent(rundy);
    public void pauseApp()
    public void destroyApp(boolean unconditional)
        notifyDestroyed();
    public void commandAction(Command c, Displayable s)
        if (c == exitCommand)
            destroyApp(false);
            notifyDestroyed();
        else if(c==addRound)
            if(rundy.size()==0)//Sprawdzenie ilo&#347;ci elementów w celu poprawnego wy&#347;wietlania liczby rund w formie
                parz=1;
                else
                parz=rundy.size();
            switch(parz)
                case 1:
                    round0=dodaj(round0);break;
                case 2:
                    round1=dodaj(round1);break;
                case 3:
                   round2= dodaj(round2);break;
                case 4:
                    round3=dodaj(round3);break;
                case 5:
                    round4=dodaj(round4);break;
                default:
                    ostrz=new Alert("Uwaga","Maksymalna liczba rund wynosi 9", null, AlertType.INFO);
                    ostrz.setTimeout(3000);
                    ekran.setCurrent(ostrz);
            if(rundy.size()==1)
                rundy.append(repeat);
                rundy.addCommand(start);
            rundy.addCommand(delRound);
        else if(c==delRound)
            if(rundy.size()!=0)
                rundy.delete(rundy.size()-2);
                if (rundy.size()==1)
                    rundy.deleteAll();
                if(rundy.size()==0)
                    rundy.removeCommand(delRound);
                    rundy.removeCommand(start);
        else if(c==start)
            ilrund=rundy.size()-1;
            if(this.repeat.size()>0)
                ilpowt=Integer.parseInt(this.repeat.getString());
            ekran = Display.getDisplay(this);
            for (i=1; i<=ilpowt;i++)
                odliczanie= new Form("Odliczanie");
                 for (j=0;j<ilrund;j++)
                    switch(j)
                         case 0:
                             odliczanie(round0);
                             break;
                         case 1:
                             odliczanie(round1);
                             break;
                         case 2:
                             odliczanie(round2);
                             break;
                         case 3:
                             odliczanie(round3);
                             break;
                         case 4:
                             odliczanie(round4);
                             break;
                         case 5:
                             odliczanie(round5);
                             break;
                         case 6:
                             odliczanie(round6);
                             break;
                         case 7:
                             odliczanie(round7);
                             break;
                         case 8:
                             odliczanie(round8);
                             break;
    class Licznik extends Thread
        int czas1,k;
        Form forma;
        monitor m;
        public Licznik(int k,Form formap)
            czas1=k;
            forma=formap;
        public synchronized void run()
            while(czas1>0)
                forma.deleteAll();
                forma.append("Czas pozosta&#322;y (s): "+czas1);
                try{Thread.sleep(1000);} catch(InterruptedException e){e.printStackTrace();}
                czas1--;
            if(czas1<=0)
                m.put();
        }and monitor class
    public class monitor
    boolean busy=false;
    synchronized void get()
        if(!busy)
            try
                wait();
            }catch(InterruptedException e){e.printStackTrace();}
        notify();
    synchronized void put()
        if(busy)
            try
            wait();
            }catch(InterruptedException e){e.printStackTrace();}
        busy=true;
        notify();
    }Can anybody help me with this?

    Groovemaker,
    Your Licznik class has a member m of type monitor, which has not been instantiated (in other words is null) hence, when calling m.put() you get NullPointerException. Please also mind, that using Thread.sleep(1000) is not an accurate way of measuring time.
    If I may, please use recommended for Java class naming conventions - some of your names use lower case, while other don't which is confusing to the reader.
    Daniel

  • Problem with threads within applet

    Hello,
    I got an applet, inside this applet I have a singleton, inside this singleton I have a thread.
    this thread is running in endless loop.
    he is doing something and go to sleep on and on.
    the problem is,
    when I refresh my IE6 browser I see more than 1 thread.
    for debug matter, I did the following things:
    inside the thread, sysout every time he goes to sleep.
    sysout in the singleton constructor.
    sysout in the singleton destructor.
    the output goes like this:
    when refresh the page, the singleton constructor loading but not every refresh, sometimes I see the constructor output and sometimes I dont.
    The thread inside the singleton is giving me the same output, sometime I see more than one thread at a time and sometimes I dont.
    The destructor never works (no output there).
    I don't understand what is going on.
    someone can please shed some light?
    thanks.
    btw. I am working with JRE 1.1
    this is very old and big applet and I can't convert it to something new.

    Ooops. sorry!
    I did.
         public void start() {
         public void stop() {
         public void destroy() {
              try {
                   resetAll();
                   Configuration.closeConnection();
                   QuoteItem.closeConnection();
              } finally {
                   try {
                        super.finalize();
                   } catch (Throwable e) {
                        e.printStackTrace();
         }

  • Problem with Threads and a static variable

    I have a problem with the code below. I am yet to make sure that I understand the problem. Correct me if I am wrong please.
    Code functionality:
    A timer calls SetState every second. It sets the state and sets boolean variable "changed" to true. Then notifies a main process thread to check if the state changed to send a message.
    The problem as far I understand is:
    Assume the timer Thread calls SetState twice before the main process Thread runs. As a result, "changed" is set to true twice. However, since the main process is blocked twice during the two calls to SetState, when it runs it would have the two SetState timer threads blocked on its synchronized body. It will pass the first one, send the message and set "changed" to false since it was true. Now, it will pass the second thread, but here is the problem, "changed" is already set to false. As a result, it won't send the message even though it is supposed to.
    Would you please let me know if my understanding is correct? If so, what would you propose to resolve the problem? Should I call wait some other or should I notify in a different way?
    Thanks,
    B.D.
    Code:
    private static volatile boolean bChanged = false;
    private static Thread objMainProcess;
       protected static void Init(){
            objMainProcess = new Thread() {
                public void run() {
                    while( objMainProcess == Thread.currentThread() ) {
                       GetState();
            objMainProcess.setDaemon( true );
            objMainProcess.start();
        public static void initStatusTimer(){
            if(objTimer == null)
                 objTimer = new javax.swing.Timer( 1000, new java.awt.event.ActionListener(){
                    public void actionPerformed( java.awt.event.ActionEvent evt){
                              SetState();
        private static void SetState(){
            if( objMainProcess == null ) return;
            synchronized( objMainProcess ) {
                bChanged = true;
                try{
                    objMainProcess.notify();
                }catch( IllegalMonitorStateException e ) {}
        private static boolean GetState() {
            if( objMainProcess == null ) return false;
            synchronized( objMainProcess ) {
                if( bChanged) {
                    SendMessage();
                    bChanged = false;
                    return true;
                try {
                    objMainProcess.wait();
                }catch( InterruptedException e ) {}
                return false;
        }

    Thanks DrClap for your reply. Everything you said is right. It is not easy to make them alternate since SetState() could be called from different places where the state could be anything else but a status message. Like a GREETING message for example. It is a handshaking message but not a status message.
    Again as you said, There is a reason I can't call sendMessage() inside setState().
    The only way I was able to do it is by having a counter of the number of notifies that have been called. Every time notify() is called a counter is incremented. Now instead of just checking if "changed" flag is true, I also check if notify counter is greater than zero. If both true, I send the message. If "changed" flag is false, I check again if the notify counter is greater than zero, I send the message. This way it works, but it is kind of a patch than a good design fix. I am yet to find a good solution.
    Thanks,
    B.D.

Maybe you are looking for

  • How do I delete songs from my iCloud account when they don't exist in iTunes?

    I have several songs that showup on my iPhone 4s with the cloud icon and downward pointing arrow. 1. I've just deleted all songs on my iPhone4s 2. Only songs with the iCloud icon showup 3. The songs on my iPhone4S that showup with the iCloud icon don

  • Recreate of user's e-mail account

    I try to recreate a deleted user. This is error which I get. How to cleanup mailstore data! Failed to create the user. The mailstore orcl.wmcs.si already has a user named gregor.razdrtic. This can happen if this user was deprovisioned but his mailsto

  • Intresting segv:studio12update1 core dump in stlport 4 startup:mixing C&C++

    Hi I am getting core dump below is the stack trace: (dbx) where current thread: t@1 =>[1] std::basic_filebuf<wchar_t,std::char_traits<wchar_t> >::imbue(0xffffffff4b3d0bf0, 0xffffffff7fffe790, 0x4c8, 0xffffffff6971f128, 0x400, 0xffffffff69711e68), at

  • "document is not self-consistent"

    What does this sybilline message mean? I assume we can leave aside the possibility that FrameMaker has analysed the text for discrepancies and contradictions ...

  • ME_FW_INSTALL

    When I try and launch the MI client installer I am getting the following error from the URL http://<fqdn>:8000/sap/bc/bsp/sap/me_fw_install/install.htm Business Server Page (BSP) error What happened? Calling the BSP page was terminated due to an erro