Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ejbFindByPrimaryKey() is returning the wrong Entity Bean instance

18 views
Skip to first unread message

Bahar Limaye

unread,
Jun 3, 2002, 5:21:45 PM6/3/02
to

Hello,

In one of our products, we are experiencing intermittent ejb entity bean caching
problems on out weblogic 6.1 SP1 servers in our cluster.

Intermittently, when we do a findByPrimaryKey(), we get the wrong EJB reference back.
It doesn't return the correct entity remote reference for the primary key.

Sometimes, we get exceptions like:

####<Jun 3, 2002 5:07:53 PM EDT> <Warning> <JTA> <epccbcbeas10> <cbc10> <ExecuteThread:
'9' for queue: 'default'> <> <> <000000> <Ignoring error in afterCompletion. Object=weblogic.ejb20.internal.TxManager$TxListener@4db8c4>

javax.ejb.EJBException: The EJB Lock Manager has received an unlock request from
EJB:SearchCriteriaBean with primary key:19720718. However, this primary key could
not be found in the Lock Manager. This indicates either an EJB container bug, or
the equals and hashCode methods for the primary key class:com.collegeboard.collegesearch.criteria.ejb.SearchCriteriaPK
are implemented incorrectly. Please check the equals and hashCode implementations.
at weblogic.ejb20.locks.ExclusiveLockManager$LockBucket.unlock(ExclusiveLockManager.java:576)
at weblogic.ejb20.locks.ExclusiveLockManager.unlock(ExclusiveLockManager.java:291)
at weblogic.ejb20.manager.ExclusiveEntityManager.afterCompletion(ExclusiveEntityManager.java:461)
at weblogic.ejb20.internal.TxManager$TxListener.afterCompletion(TxManager.java:421)
at weblogic.transaction.internal.ServerSCInfo.callAfterCompletions(ServerSCInfo.java:464)
at weblogic.transaction.internal.ServerTransactionImpl.callAfterCompletions(ServerTransactionImpl.java:2109)
at weblogic.transaction.internal.ServerTransactionImpl.setCommitted(ServerTransactionImpl.java:2081)
at weblogic.transaction.internal.ServerTransactionImpl.globalRetryCommit(ServerTransactionImpl.java:1942)
at weblogic.transaction.internal.ServerTransactionImpl.globalCommit(ServerTransactionImpl.java:1886)
at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:221)
at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:190)
at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:231)
at com.collegeboard.collegesearch.searchsession.ejb.PerformSearchBean_hwtp47_EOImpl.loadSavedSearchCriteria(PerformSearchBean_hwtp47_EOImpl.java:588)
at jsp_servlet._search._my.__startsavedsearch._jspService(__startsavedsearch.java:420)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:27)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:265)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2456)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2039)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
####<Jun 3, 2002 5:14:32 PM EDT> <Info> <WebLogicServer> <epccbcbeas10> <cbc10> <ExecuteThread:
'3' for queue: 'default'> <> <> <000274> <Removing "ClientContext - id: '#|cbc10|751.1022686072598',
bound: 'false', dead: 'false'" because of soft disconnect timeout.>

Our primary key looks like:

package com.collegeboard.collegesearch.college.ejb;

import java.io.Serializable;

public class CollegePK implements Serializable {

public Integer collegeId;

public CollegePK() {}

public CollegePK(Integer id)
{
collegeId = id;
}

public boolean equals(Object obj)
{
if (obj == null || !(obj instanceof CollegePK))
return false;
else if (((CollegePK)obj).collegeId.intValue() == collegeId.intValue())
return true;
else
return false;
}

public int hashCode()
{
return collegeId.hashCode();
}

public String toString()
{
return new String("College ID is: " + collegeId);
}

}//end CollegePK

It may not be the most efficient, but I hope it is right.

Our ejb-jar.xml looks like:

<weblogic-enterprise-bean>
<ejb-name>CollegeBean</ejb-name>
<caching-descriptor>
<max-beans-in-free-pool>50</max-beans-in-free-pool>
<max-beans-in-cache>2500</max-beans-in-cache>
<idle-timeout-seconds>3600</idle-timeout-seconds>
<cache-strategy>Read-Only</cache-strategy>
<read-timeout-seconds>3600</read-timeout-seconds>
</caching-descriptor>
<persistence-descriptor>
<is-modified-method-name>isModified</is-modified-method-name>
</persistence-descriptor>
<reference-descriptor>
<resource-description>
<res-ref-name>collegePool</res-ref-name>
<jndi-name>collegePool</jndi-name>
</resource-description>
</reference-descriptor>
<jndi-name>college.CollegeHome</jndi-name>
</weblogic-enterprise-bean>

Transactions are TX_REQUIRED for the read-only bean.

Please help.

Thanks.

--Bahar

Rajesh Mirchandani

unread,
Jun 3, 2002, 9:16:58 PM6/3/02
to
Message-ID: <3CFC150A...@ToNewsgroup.Only>
Date: Mon, 03 Jun 2002 18:16:58 -0700
From: Rajesh Mirchandani <Re...@ToNewsgroup.Only>
Reply-To: Re...@ToNewsgroup.Only
X-Mailer: Mozilla 4.7 [en] (WinNT; U)
X-Accept-Language: en
MIME-Version: 1.0
Newsgroups: weblogic.developer.interest.ejb
Subject: Re: ejbFindByPrimaryKey() is returning the wrong Entity Bean instance
References: <3cfbdde9$1...@newsgroups2.bea.com>
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
NNTP-Posting-Host: 65.193.194.221
X-Original-NNTP-Posting-Host: 65.193.194.221
X-Trace: 3 Jun 2002 18:18:25 -0700, 65.193.194.221
X-Original-Trace: 3 Jun 2002 18:18:25 -0700, 65.193.194.221
Organization: BEA SYSTEMS Inc
Lines: 127
XPident: Unknown
Path: newsgroups2.bea.com
Xref: newsgroups2.bea.com weblogic.developer.interest.ejb:33627

Have a look at

http://newsgroups.bea.com/cgi-bin/dnewsweb?utag=&group=weblogic.developer.interest.ejb&xrelated=30288&cmd_thread_next.x=70&cmd_thread_next.y=11

Bahar Limaye wrote:

--
Rajesh Mirchandani
Developer Relations Engineer
BEA Support


Rajesh Mirchandani

unread,
Jun 3, 2002, 9:17:29 PM6/3/02
to
This has been fixed in SP2.

Bahar Limaye

unread,
Jun 4, 2002, 8:04:11 AM6/4/02
to

We are in a production environment and cannot easily move to SP2. Does the fix in
SP2 relate to the findByPrimaryKey() returning a wrong reference (different pks instance)?

Can you give me a bug description and solution for this fix?

Is there anything that I can do on my production system to isolate the problem?

Thanks.

><!doctype html public "-//w3c//dtd html 4.0 transitional//en">
><html>


>This has been fixed in SP2.

><p>Rajesh Mirchandani wrote:
><blockquote TYPE=CITE>Have a look at
><p><a href="http://newsgroups.bea.com/cgi-bin/dnewsweb?utag=&group=weblogic.developer.interest.ejb&xrelated=30288&cmd_thread_next.x=70&cmd_thread_next.y=11">http://newsgroups.bea.com/cgi-bin/dnewsweb?utag=&group=weblogic.developer.interest.ejb&xrelated=30288&cmd_thread_next.x=70&cmd_thread_next.y=11</a>
><p>Bahar Limaye wrote:
><p>> Hello,
><br>>
><br>> In one of our products, we are experiencing intermittent ejb entity
>bean caching
><br>> problems on out weblogic 6.1 SP1 servers in our cluster.
><br>>
><br>> Intermittently, when we do a findByPrimaryKey(), we get the wrong
>EJB reference back.
><br>>  It doesn't return the correct entity remote reference for the
>primary key.
><br>>
><br>> Sometimes, we get exceptions like:
><br>>
><br>> ####<Jun 3, 2002 5:07:53 PM EDT> <Warning> <JTA> <epccbcbeas10>
><cbc10> <ExecuteThread:
><br>> '9' for queue: 'default'> <> <> <000000> <Ignoring error
>in afterCompletion. Object=weblogic.ejb20.internal.TxManager$TxListener@4db8c4>
><br>>
><br>> javax.ejb.EJBException: The EJB Lock Manager has received an unlock
>request from
><br>> EJB:SearchCriteriaBean with primary key:19720718. However, this primary
>key could
><br>> not be found in the Lock Manager. This indicates either an EJB container
>bug, or
><br>> the equals and hashCode methods for the primary key class:com.collegeboard.collegesearch.criteria.ejb.SearchCriteriaPK
><br>> are implemented incorrectly. Please check the equals and hashCode
>implementations.
><br>>         at weblogic.ejb20.locks.ExclusiveLockManager$LockBucket.unlock(ExclusiveLockManager.java:576)
><br>>         at weblogic.ejb20.locks.ExclusiveLockManager.unlock(ExclusiveLockManager.java:291)
><br>>         at weblogic.ejb20.manager.ExclusiveEntityManager.afterCompletion(ExclusiveEntityManager.java:461)
><br>>         at weblogic.ejb20.internal.TxManager$TxListener.afterCompletion(TxManager.java:421)
><br>>         at weblogic.transaction.internal.ServerSCInfo.callAfterCompletions(ServerSCInfo.java:464)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.callAfterCompletions(ServerTransactionImpl.java:2109)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.setCommitted(ServerTransactionImpl.java:2081)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.globalRetryCommit(ServerTransactionImpl.java:1942)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.globalCommit(ServerTransactionImpl.java:1886)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:221)
><br>>         at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:190)
><br>>         at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:231)
><br>>         at com.collegeboard.collegesearch.searchsession.ejb.PerformSearchBean_hwtp47_EOImpl.loadSavedSearchCriteria(PerformSearchBean_hwtp47_EOImpl.java:588)
><br>>         at jsp_servlet._search._my.__startsavedsearch._jspService(__startsavedsearch.java:420)
><br>>         at weblogic.servlet.jsp.JspBase.service(JspBase.java:27)
><br>>         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:265)
><br>>         at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200)
><br>>         at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2456)
><br>>         at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2039)
><br>>         at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139)
><br>>         at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
><br>> ####<Jun 3, 2002 5:14:32 PM EDT> <Info> <WebLogicServer>
><epccbcbeas10> <cbc10> <ExecuteThread:
><br>> '3' for queue: 'default'> <> <> <000274> <Removing "ClientContext


>- id: '#|cbc10|751.1022686072598',

><br>> bound: 'false', dead: 'false'" because of soft disconnect timeout.>
><br>>
><br>> Our primary key looks like:
><br>>
><br>> package com.collegeboard.collegesearch.college.ejb;
><br>>
><br>> import java.io.Serializable;
><br>>
><br>> public class CollegePK implements Serializable {
><br>>
><br>>         public Integer collegeId;
><br>>
><br>>         public CollegePK()
>{}
><br>>
><br>>         public CollegePK(Integer
>id)
><br>>         {
><br>>                
>collegeId = id;
><br>>         }
><br>>
><br>>         public boolean equals(Object
>obj)
><br>>         {
><br>>                


>if (obj == null || !(obj instanceof CollegePK))

><br>>                
>return false;
><br>>         else if (((CollegePK)obj).collegeId.intValue()
>== collegeId.intValue())
><br>>                
>return true;
><br>>         else
><br>>                
>return false;
><br>>         }
><br>>
><br>>         public int hashCode()
><br>>         {
><br>>                
>return collegeId.hashCode();
><br>>         }
><br>>
><br>>         public String toString()
><br>>         {
><br>>                


>return new String("College ID is: " + collegeId);

><br>>         }
><br>>
><br>> }//end CollegePK
><br>>
><br>> It may not be the most efficient, but I hope it is right.
><br>>
><br>> Our ejb-jar.xml looks like:
><br>>
><br>> <weblogic-enterprise-bean>
><br>>         <ejb-name>CollegeBean</ejb-name>
><br>>         <caching-descriptor>
><br>>            
><max-beans-in-free-pool>50</max-beans-in-free-pool>
><br>>            
><max-beans-in-cache>2500</max-beans-in-cache>
><br>>            
><idle-timeout-seconds>3600</idle-timeout-seconds>
><br>>            
><cache-strategy>Read-Only</cache-strategy>
><br>>            
><read-timeout-seconds>3600</read-timeout-seconds>
><br>>         </caching-descriptor>
><br>>         <persistence-descriptor>
><br>>            
><is-modified-method-name>isModified</is-modified-method-name>
><br>>         </persistence-descriptor>
><br>>         <reference-descriptor>
><br>>            
><resource-description>
><br>>                
><res-ref-name>collegePool</res-ref-name>
><br>>                
><jndi-name>collegePool</jndi-name>
><br>>            
></resource-description>
><br>>         </reference-descriptor>
><br>>         <jndi-name>college.CollegeHome</jndi-name>
><br>>     </weblogic-enterprise-bean>
><br>>
><br>> Transactions are TX_REQUIRED for the read-only bean.
><br>>
><br>> Please help.
><br>>
><br>> Thanks.
><br>>
><br>> --Bahar
><p>--
><br>Rajesh Mirchandani
><br>Developer Relations Engineer
><br>BEA Support</blockquote>
>
><p>--
><br>Rajesh Mirchandani
><br>Developer Relations Engineer
><br>BEA Support
><br> </html>
>
>

Deyan D. Bektchiev

unread,
Jun 4, 2002, 1:11:51 PM6/4/02
to
Forget about the patch -- it was only related to a bug that is included
in both 6.1SP1 and SP2. My problem was with 6.0 and not 6.1

What you probably see is related to the mutability of your PK class.

Can you make the collegeId private in your PK class and not provide
accessor to modify it.

If your design does not allow that, try placing a debug statement at any
place that it might be modified and print the old and new values -- if
they are different, then that is your problem and the fix is not to
mutate the PK instance once the container has a hold of it.

HTH

--dejan

Bahar Limaye

unread,
Jun 4, 2002, 2:44:49 PM6/4/02
to

Ok, I will try that. Thanks.
0 new messages