• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: 20 Second Delay on editingContext.saveChanges()
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 20 Second Delay on editingContext.saveChanges()


  • Subject: Re: 20 Second Delay on editingContext.saveChanges()
  • From: Alexis Tual <email@hidden>
  • Date: Thu, 8 Jul 2010 18:35:28 +0200


Le 8 juil. 2010 à 16:23, Greg Lappen a écrit :

I did turn on database logging.  What I saw was that the app selected the next value from a sequence, then paused for 20 seconds, then did an insert (and then did 20 other sql statements within a second).  It does the same exact thing each time.

Also, the java process is using over 100% cpu, not the database...hence they mystery :(

Looks like something is different between your servers. 
Do you deploy your app with frameworks embedded in it ? Also just for information, Wonder patches NSArray class, that's why you're not seeing something wonder specific in the thread dumps.
Maybe different (and buggy) jdbc drivers ?

Good luck,

Alex


On Thu, Jul 8, 2010 at 10:02 AM, John Huss <email@hidden> wrote:
Did you turn on SQL logging?  Is it executing queries in that time?  Probably the database is the bottleneck.

John

On Thu, Jul 8, 2010 at 8:46 AM, Greg Lappen <email@hidden> wrote:
 Hi all,

I am running into a bizarre issue with our WebObjects Application.  I have searched the lists for quite a while, but could not find a case where someone had the same problem.

What is even stranger is that our application is deployed on two different servers, both with WebObjects 5.4.3 and in one environment the issue occurs, and not in the other.  

What I see is that calling editingContext.saveChanges() is returning immediately in one case, and hanging for 20 seconds in the other case.  It's not really "hanging" - the CPU is pegged at over 100%, and taking thread dumps during that 20 seconds shows something like this:

"WorkerThread3" prio=5 tid=0x000000010296a800 nid=0x1519b2000 runnable [0x00000001519af000]
   java.lang.Thread.State: RUNNABLE
at java.lang.reflect.Array.newInstance(Array.java:52)
at com.webobjects.foundation._NSCollectionPrimitives.copyArray(_NSCollectionPrimitives.java:123)
at com.webobjects.foundation.NSArray.objectsNoCopy(NSArray.java:356)
at com.webobjects.foundation.NSMutableArray._removeObject(NSMutableArray.java:225)
at com.webobjects.foundation.NSMutableArray.removeObject(NSMutableArray.java:247)
at com.webobjects.foundation.NSMutableArray.removeObjects(NSMutableArray.java:399)
at com.webobjects.foundation.NSMutableArray.removeObjectsInArray(NSMutableArray.java:285)
at com.webobjects.foundation._NSArrayUtilities.arrayExcludingObjectsFromArray(_NSArrayUtilities.java:173)
at com.webobjects.eoaccess.EODatabaseContext.recordChangesInEditingContext(EODatabaseContext.java:5943)
at com.webobjects.eocontrol.EOObjectStoreCoordinator.saveChangesInEditingContext(EOObjectStoreCoordinator.java:373)
at com.webobjects.eocontrol.EOEditingContext.saveChanges(EOEditingContext.java:3192)
at net.paperfree.lightbeam.model.LPFile.setFileData(LPFile.java:102)

Seems like the EODatabaseContext is doing some housekeeping before executing the SQL....here's the Java code in question:

public class LPFile extends _LPFile {
    ....
    ....
    public synchronized void setFileData(NSData fileData) throws IOException {
// Update forms by deleting existing ones, then adding new ones
        for (int i=lpFileForms().count()-1; i>=0; i--) {
            final LPFileForm lpFileForm = (LPFileForm) lpFileForms().objectAtIndex(i);
            this.removeFromLpFileForms(lpFileForm);
            editingContext().deleteObject(lpFileForm);
        }

        // Get new form list via SOAP call
        Element docInfoElm = LPServer.threadLocal().exportDocumentInfo(this);       
        List formElms = formsElm.getChildren("form");
        for (int i = 0; i < formElms.size(); i++) {
            Element formElm = (Element) formElms.get(i);
            LPFileForm lpFileForm = new LPFileForm();
   
   // extract data from xml, put into lpFileForm

   // Setup relationships to lpForm and lpFile
   lpFileForm.setLpForm(lpForm);
            lpFileForm.setLpFormID(lpForm.id());
            lpFileForm.setLpFile(this);
            lpFileForm.setLpFileID(this.fileID());    

   this.addToLpFileForms(lpFileForm);
            editingContext().insertObject(lpFileForm);
}

editingContext().saveChanges();
    }
    ....
    ....
}

Does the above code have anything obviously wrong with it?  It's basically clearing a one-to-many relationship, then re-populating it.  I call this.addToLpFileForms() because I want the relationship updated in memory as well as in the database.

Any insight would be hugely appreciated.

Thanks,

Greg

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (email@hidden) Help/Unsubscribe/Update your Subscription: This email sent to email@hidden
References: 
 >20 Second Delay on editingContext.saveChanges() (From: Greg Lappen <email@hidden>)
 >Re: 20 Second Delay on editingContext.saveChanges() (From: John Huss <email@hidden>)
 >Re: 20 Second Delay on editingContext.saveChanges() (From: Greg Lappen <email@hidden>)

  • Prev by Date: HELP: Apache Segmentation Faults
  • Next by Date: Re: 20 Second Delay on editingContext.saveChanges()
  • Previous by thread: Re: 20 Second Delay on editingContext.saveChanges()
  • Next by thread: Re: 20 Second Delay on editingContext.saveChanges()
  • Index(es):
    • Date
    • Thread