Aaron, thanks, this I hope I sort of understand.
Still, in the garbage-collected environment, any object, far as I can say, should (a) be automatically disposed when there's no explicit reference to it, regardless of whether it is cheap or big; (b) if there's some internal means to keep unreferenced objects alive forever, it should be explicitly documented (e.g., like EOObjectStoreCoordinator.defaultCoordinator()). What am I overlooking? And, much more important question: is the explicitly called dispose indeed the right and safe way to get rid of an OSC, wouldn't it cause some other problems elsewhere in the future? Thanks, OC > On 29. 6. 2020, at 4:17 PM, Aaron Rosenzweig <aa...@chatnbike.com> wrote: > > 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 <mailto: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 >> <mailto:Webobjects-dev@lists.apple.com>) >> Help/Unsubscribe/Update your Subscription: >> https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com >> <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