"Hacky"... what a strange word.
> # er.extensions.ERXJDBCAdaptor.className=er.extensions.jdbc.ERXJDBCAdaptor
I think we can set this as the default further on. In particular as this also
fixes the §$% SQL-Error-messes-up-DBCs issues.
Cheers, Anjo
Am 12.11.2009 um 20:10 schrieb Mike Schrag:
> I would add a stack trace into dataBaseChannelNeeded in
> ERXAdaptorChannelDelegate to get the stack of exactly where it's called ...
> my first thought was jdbc2Info, too, but I thought I fixed this a couple
> years ago.
>
> Ah .. That's done in ERXJDBCAdaptor, which is only used if you explicitly set
> it:
>
> ## Class name to use instead of the JDBCAdaptor, the ERXJDBCAdaptor supports
> ## connection pooling
> # er.extensions.ERXJDBCAdaptor.className=er.extensions.jdbc.ERXJDBCAdaptor
>
> See if that does anything for you. The fix for closing that connection is
> REALLY hacky. My favorite part is how I didn't put a SINGLE comment on the
> code that does it. Old me hated future me, though.
>
>> protected JDBCContext _cachedAdaptorContext() {
>> if (_cachedContext == null) {
>> _cachedContext = createJDBCContext();
>> }
>> return _cachedContext;
>> }
>>
>> protected NSDictionary jdbcInfo() {
>> boolean closeCachedContext = (_cachedContext == null &&
>> _jdbcInfo == null);
>> NSDictionary jdbcInfo = super.jdbcInfo();
>> if (closeCachedContext && _cachedContext != null) {
>> _cachedContext.disconnect();
>> _cachedContext = null;
>> }
>> return jdbcInfo;
>> }
>>
>> protected NSDictionary typeInfo() {
>> boolean closeCachedContext = (_cachedContext == null &&
>> _jdbcInfo == null);
>> NSDictionary typeInfo = super.typeInfo();
>> if (closeCachedContext && _cachedContext != null) {
>> _cachedContext.disconnect();
>> _cachedContext = null;
>> }
>> return typeInfo;
>> }
>>
>> public Context createJDBCContext() {
>> Context context = new Context(this);
>> return context;
>> }
>>
>> public EOAdaptorContext createAdaptorContext() {
>> EOAdaptorContext context;
>> if (_cachedContext != null) {
>> context = _cachedContext;
>> _cachedContext = null;
>> }
>> else {
>> context = createJDBCContext();
>> }
>> return context;
>> }
>
> On Nov 12, 2009, at 2:00 PM, Chuck Hill wrote:
>
>> On Nov 11, 2009, at 6:06 PM, Kieran Kelleher wrote:
>>
>>> OK, if Jeff Schmitz is going to resurrect an old thread today, then so am I
>>> ;-)
>>
>> :-P
>>
>>
>>> OK, I use Wonder (like driving with a seatbelt on) ... anyhow, I use
>>> ERXObjectStoreCoordinator exclusively (even for the default OSC) and I can
>>> confirm that each time I open a new ERXOSC (passing true - to close conns
>>> on dispose - in the boolean param constructor), two connections are
>>> created. Then when I dispose, one is closed and the other is left open.
>>
>> One connection is expected. The other I would expect to be fetching
>> JDBC2Info data for one or more models lacking this. That connection does
>> not get closed properly by EOF. As I noted before, Mr. Schrag tracked this
>> down and is closing it in some piece of code. Where that code is, I do not
>> know. Mike, you there?
>>
>>
>> Chuck
>>
>>
>>
>>> In this example, connection id's 3 and 4 are created as follows:
>>>
>>> 3 Connect w3b0bj3...@localhost on cheetah
>>> 3 Query SHOW SESSION VARIABLES
>>> 3 Query SHOW COLLATION
>>> 3 Query SET character_set_results = NULL
>>> 3 Query SET autocommit=1
>>> 3 Query SET
>>> sql_mode='STRICT_ALL_TABLES,STRICT_TRANS_TABLES'
>>> 3 Query SELECT @@session.tx_isolation
>>> 3 Query SET autocommit=0
>>> 4 Connect w3b0bj3...@localhost on cheetah
>>> 4 Query SHOW SESSION VARIABLES
>>> 4 Query SHOW COLLATION
>>> 4 Query SET character_set_results = NULL
>>> 4 Query SET autocommit=1
>>> 4 Query SET
>>> sql_mode='STRICT_ALL_TABLES,STRICT_TRANS_TABLES'
>>> 4 Query SELECT @@session.tx_isolation
>>> 4 Query SET autocommit=0
>>>
>>> Connection #3 is the one that is actually used by EOF throughout EOF
>>> operations during the life of the ERXOSC.
>>>
>>> After using the OSC and calling dispose, #3 gets closed by ERXOSC and #4
>>> remains.
>>>
>>> The statements above are identical when both connections are opened, and
>>> the ones shown for #4 are all there is for #4.... not another single
>>> statement.
>>>
>>> Any thoughts on how we can get both connections closed when the ERXOSC is
>>> disposed of?
>>>
>>> Regards, Kieran
>>>
>>>
>>>
>>> On Jul 7, 2008, at 6:12 PM, Chuck Hill wrote:
>>>
>>>>
>>>> On Jul 7, 2008, at 2:38 PM, Klaus Berkling wrote:
>>>>
>>>>>
>>>>> On Jul 2, 2008, at 4:50 PM, Chuck Hill wrote:
>>>>>
>>>>>>
>>>>>> On Jul 1, 2008, at 2:41 PM, Klaus Berkling wrote:
>>>>>>
>>>>>>> Hi all.
>>>>>>>
>>>>>>> In my application I'm trying to use independent access layer stacks to
>>>>>>> open multiple database connections to the database.
>>>>>>> I use this code:
>>>>>>>
>>>>>>> EOObjectStoreCoordinator parentObjectStore = new
>>>>>>> EOObjectStoreCoordinator();
>>>>>>> EOEditingContext editingContext = new
>>>>>>> EOEditingContext(parentObjectStore);
>>>>>>> setDefaultEditingContext(editingContext);
>>>>>>>
>>>>>>> This looks like it's working in that it opens two new connection to the
>>>>>>> database when I start a new session. As expected.
>>>>>>
>>>>>> If it is opening two, I'd expect one to be to get the JDBC2 Info and the
>>>>>> other for EOF to use to fetch data. As Mike noted earlier, getting EOF
>>>>>> to close the JDBC 2 Info connection is tricky. Can you get the DB to
>>>>>> log what is sent over each connection? That should indicate if I am
>>>>>> right or not.
>>>>>
>>>>>
>>>>> This is what shows up in the mysql log when my client connects:
>>>>>
>>>>> 080707 14:27:10 67 Connect xx...@yyyyyy on zzzzzzz
>>>>> 67 Query SET NAMES latin1
>>>>> 67 Query SET character_set_results = NULL
>>>>> 67 Query SHOW VARIABLES
>>>>> 67 Query SHOW COLLATION
>>>>> 67 Query SET autocommit=1
>>>>> 67 Query SHOW VARIABLES LIKE 'tx_isolation'
>>>>> 67 Query SET autocommit=0
>>>>> 68 Connect xx...@yyyyyy on zzzzzzz
>>>>> 68 Query SET NAMES latin1
>>>>> 68 Query SET character_set_results = NULL
>>>>> 68 Query SHOW VARIABLES
>>>>> 68 Query SHOW COLLATION
>>>>> 68 Query SET autocommit=1
>>>>> 68 Query SHOW VARIABLES LIKE 'tx_isolation'
>>>>> 68 Query SET autocommit=0
>>>>>
>>>>> At logout from the client:
>>>>>
>>>>> 080707 14:27:16 67 Prepare [25] UPDATE RS_USER_SESSION SET
>>>>> LOUT_TIME = ? WHERE (USER_SESSION_PK = ? AND LOGIN_GROUP_NUM = ? AND
>>>>> LOGIN_STUDENT_PK is NULL)
>>>>> 67 Execute [25] UPDATE RS_USER_SESSION SET LOUT_TIME =
>>>>> '2008-07-07 14:30:06' WHERE (USER_SESSION_PK = '558446' AND
>>>>> LOGIN_GROUP_NUM = '1' AND LOGIN_STUDENT_PK is NULL)
>>>>> 67 Query commit
>>>>> 67 Query rollback
>>>>> 67 Quit
>>>>>
>>>>> There never is a Quit from 68.
>>>>
>>>> It is hard to say from that, the jcbc2info request might not get logged
>>>> like this. But my money is still on the jdbc2info connection. It fits
>>>> all of the evidence.
>>>>
>>>> Mike figured out how to close it, but I don't know where the code is in
>>>> Wonder. Hmmm, that might have been in Entity Modeler.
>>>>
>>>> Mike?
>>>>
>>>>
>>>> Chuck
>>>>
>>>>
>>>>>>> When I'm terminate the session I use this code to close the connection
>>>>>>> to the database:
>>>>>>>
>>>>>>> 'editingContext' is the session 'defaultEditingContext()'
>>>>>>>
>>>>>>> EOObjectStoreCoordinator parentObjectStore =
>>>>>>> (EOObjectStoreCoordinator)(editingContext.parentObjectStore());
>>>>>>> NSArray databaseContexts =
>>>>>>> parentObjectStore.cooperatingObjectStores();
>>>>>>> int contextCount = databaseContexts.count();
>>>>>>>
>>>>>>> for (int i = 0; i < contextCount; i++) {
>>>>>>> NSArray channels =
>>>>>>> ((EODatabaseContext)databaseContexts.objectAtIndex(i)).registeredChannels();
>>>>>>> int channelCount = channels.count();
>>>>>>> for (int j = 0; j < channelCount; j++) {
>>>>>>> //Make sure the channel you're trying to close isn't
>>>>>>> performing a transaction.
>>>>>>> if
>>>>>>> (!((EODatabaseChannel)channels.objectAtIndex(j)).adaptorChannel().adaptorContext().hasOpenTransaction())
>>>>>>> {
>>>>>>>
>>>>>>> ((EODatabaseChannel)channels.objectAtIndex(j)).adaptorChannel().closeChannel();
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> This closes one of the two database connection, not both.
>>>>>>>
>>>>>>> Is there a way to detect the one extra connection or not open the extra
>>>>>>> connection in the first place?
>>>>>>>
>>>>>>> WOnder may have resolved this issue but adding WOnder is a bigger
>>>>>>> undertaking then I originally expected.
>>>>>>> Paraphrasing Lou Reed, I just want some of it, not all of it.
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> kib
>>>>>>>
>>>>>>> "Success is not final, failure is not fatal: it is the courage to
>>>>>>> continue that counts.”
>>>>>>> - Winston Churchill
>>>>>>>
>>>>>>> Klaus Berkling
>>>>>>> Systems Administrator
>>>>>>> DynEd International, Inc.
>>>>>>> www.dyned.com | www.eskimo.com/~kiberkli
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Do not post admin requests to the list. They will be ignored.
>>>>>>> Webobjects-dev mailing list ([email protected])
>>>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>>> http://lists.apple.com/mailman/options/webobjects-dev/chill%40global-village.net
>>>>>>>
>>>>>>> This email sent to [email protected]
>>>>>>
>>>>>> --
>>>>>>
>>>>>> Practical WebObjects - for developers who want to increase their overall
>>>>>> knowledge of WebObjects or who are trying to solve specific problems.
>>>>>> http://www.global-village.net/products/practical_webobjects
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> Thanks
>>>>>
>>>>> kib
>>>>>
>>>>> "Success is not final, failure is not fatal: it is the courage to
>>>>> continue that counts.”
>>>>> - Winston Churchill
>>>>>
>>>>> Klaus Berkling
>>>>> Systems Administrator
>>>>> DynEd International, Inc.
>>>>> www.dyned.com | www.eskimo.com/~kiberkli
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>>
>>>> Practical WebObjects - for developers who want to increase their overall
>>>> knowledge of WebObjects or who are trying to solve specific problems.
>>>> http://www.global-village.net/products/practical_webobjects
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Do not post admin requests to the list. They will be ignored.
>>>> Webobjects-dev mailing list ([email protected])
>>>> Help/Unsubscribe/Update your Subscription:
>>>> http://lists.apple.com/mailman/options/webobjects-dev/kieran_lists%40mac.com
>>>>
>>>> This email sent to [email protected]
>>>
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list ([email protected])
>>> Help/Unsubscribe/Update your Subscription:
>>> http://lists.apple.com/mailman/options/webobjects-dev/chill%40global-village.net
>>>
>>> This email sent to [email protected]
>>
>> --
>> Chuck Hill Senior Consultant / VP Development
>>
>> Practical WebObjects - for developers who want to increase their overall
>> knowledge of WebObjects or who are trying to solve specific problems.
>> http://www.global-village.net/products/practical_webobjects
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/mschrag%40mdimension.com
>>
>> This email sent to [email protected]
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list ([email protected])
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/anjo%40krank.net
>
> This email sent to [email protected]
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]