OSC is a cursor to the DB. They aren’t particularly cheap to acquire. As far as I know, they live until you dispose of them. They don’t automatically dispose. They are not cheap like an editingContext. One OSC can service a plethora of editingContexts. Simple WOApps have two OSC for the life of the WOApp:
#1 made for the JDBCInfo, kind of dumb to keep around, Wonder has calls to close this one. #2 stays around and used for any new editing context you make where you don’t specifically give it a new OSC. AARON ROSENZWEIG / Chat 'n Bike <http://www.chatnbike.com/> e: aa...@chatnbike.com <mailto:aa...@chatnbike.com> t: (301) 956-2319 > On Jun 29, 2020, at 10:12 AM, ocs--- via Webobjects-dev > <webobjects-dev@lists.apple.com> wrote: > > Hi there, > > it seems finally I succeeded to find the culprit of the problem described > below. Far as my testing shows, it seems an ObjectStoreCoordinator is never > garbage collected (presumed it has been used at least once for a fetch). > Since the OSC opens a socket to the database, this leads to the problem with > a number of open sockets for a process. Far as my testing shows, the only way > to make it to do poof is to call dispose manually, which seems a bit at the > unexpected side, at least for me. > > My current test code looks like this: > > === > class MainPage extends OCSComponent { > def test { > def osc=new OCSOSC(),ec=new OCSEC(osc) > println "created $osc and $ec" > def obj=EOUtilities.objectWithPrimaryKeyValue(ec,'DBAuction',1000001) > //[FETCH] > println "got obj $obj and dying..." > ec=nil > osc.dispose() //[WHATTHE] > osc=nil > System.gc() > nil > } > } > class OCSOSC extends EOObjectStoreCoordinator { > void finalize() { > println "### $this about to die" > } > } > @InheritConstructors class OCSEC extends ERXEC { > void finalize() { > println "### $this about to die" > } > } > === > > If both the lines marked [FETCH] and [WHATTHE] above are commented out, i.e., > if the OSC never fetches, both the osc and ec objects report finalizing > without a need to dispose. > > Nevertheless, once the fetch happens as above, [WHATTHE] must be active too — > otherwise only ec gets garbage collected; osc never ever does (and > subsequently also never releases its DB socket). > > Well the explicit dispose seems to be the fix for my problem, so far it seems > to work properly; but since I did not find any mention of calling dispose > manually nor using a dispose registry in the documentation (otherwise than > those two registries related to archivation and D2JClient), I wonder whether > this is the proper approach, or whether I am doing something wrong and sooner > or later I am in for an ugly surprise? Any insight here? > > Thanks a lot, > OC > >> On 21. 5. 2020, at 1:13 PM, OCsite <o...@ocs.cz <mailto:o...@ocs.cz>> wrote: >> >> Hi there, >> >> bumped lately into another weird problem. We import some data into DB in >> background tasks. Up to yesterday, it worked normally; today six import >> tasks were launched, and each of them seemingly hang in its first DB >> operation. Restart did help; alas, the site admins did not try to ask JVM to >> detect deadlocks when they restarted the application. >> >> The background task looks like this: >> >> === >> class ImportCSVTask extends ERXLongResponseTask.DefaultImplementation { >> def performAction { >> _thread.priority=Thread.MIN_PRIORITY >> try { >> try { >> editingContext=ERXEC.newEditingContext(objectStore=new >> EOObjectStoreCoordinator()) >> editingContext.lock() >> lognow 1, "=== preparing CSV import in EC $editingContext >> ===" >> >> formPrototype=ERXEOGlobalIDUtilities.fetchObjectWithGlobalID(editingContext,formPrototypeGID) >> lognow 1, "=== local prototype $formPrototype ===" >> ... ... >> === >> >> Always the “preparing” log was the last thing those threads presented; none >> of them ever reported “local prototype”. There's no other related log in >> there. >> >> Meantime the application ran normally and the worker tasks communicated with >> the database all right (with an occasional report that some select took >> 70-odd ms from ERXAdaptorChannelDelegate, we have the threshold at 50). We >> run with ERXObjectStoreCoordinatorPool.maxCoordinators=1. >> >> Any idea what could have gone wrong and how to find the culprit and prevent >> the problem in future? I thought a new EC in a new OSC can't be blocked for >> long, but self-evidently, I was wrong, they seemed to lock indefinitely >> (application was restarted ten-odd hours after the first import hanged after >> its “preparing” report, still no “local prototype”). >> >> Thanks and all the best, >> OC >> > > _______________________________________________ > Do not post admin requests to the list. They will be ignored. > Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) > Help/Unsubscribe/Update your Subscription: > https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com > > This email sent to aa...@chatnbike.com
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com