Castor doesn't support clustering yet. If you do a search on the mailing list, you can find posts by Bruce, Keith, I about possible ways of implementing clustering with Castor. I also included a rough diagram of how it might be implemented using an open-source distributed caching technology. Unfortunately, I'm not at the "clustering" stage in my project yet, so I haven't had time to work on it. If you could look at it, add some thoughts, and perhaps even contribute some "starter code" for Castor, that would be great!
Have a nice weekend.
At 14:29 03/06/06 -0700, you wrote:
-----Original Message----- From: Steve Chernyak [mailto:[EMAIL PROTECTED] Sent: Friday, June 06, 2003 12:10 PM To: [EMAIL PROTECTED] Subject: [castor-dev] Missing records from OQLQuery
Im having a problem retrieving records from the database using OQLQuery. I am running an a clustered WebLogic 8.1 environment using 0.9.4.3 version of castor.
The problem:
Executing the same query from different servers in the cluster results in different size results being returned. A record is missing on one of the servers. This problem goes away after the servers are restarted. Also, this doesnt happen all the time.
I am attaching the relevent part of mapping.xml and the method that does the querying. I hope this is enough information:
public List findLoanApplications(Query query) throws DataAccessException {
StringBuffer queryBuffer = new StringBuffer(); List parameters = new ArrayList(); int counter = 0; if(query.getDecision() != null) { List codes = retrieveStatusCodes(query.getDecision()); if(codes == null || codes.size() < 1) { throw new DataAccessException("Unable to retrieve decision codes " + "for group " + query.getDecision()); } if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } Iterator iter = codes.iterator(); queryBuffer.append(" ("); for(int i = 0; iter.hasNext(); i++) { StatusElement element = (StatusElement)iter.next(); parameters.add(counter, element.getStatus()); if(i > 0) { queryBuffer.append(" OR"); } queryBuffer.append(" l.decision.status=$" + (++counter)); } queryBuffer.append(")"); }
if(query.getCareer() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getCareer()); queryBuffer.append(" l.school.name=$" + (++counter)); }
if(query.getEmployeeId() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getEmployeeId()); queryBuffer.append(" l.student.studentId=$" + (++counter)); }
if(query.getProcessChangeEndDate() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getProcessChangeEndDate()); queryBuffer.append(" l.statusChangeDate<=$" + (++counter)); }
if(query.getLastName() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getLastName().toUpperCase()); queryBuffer.append(" l.student.name.upperLast=$" + (++counter)); }
if(query.getSsn() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getSsn()); queryBuffer.append(" l.student.ssn=$" + (++counter)); }
if(query.getProcessChangeStartDate() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getProcessChangeStartDate()); queryBuffer.append(" l.statusChangeDate>=$" + (++counter)); }
if(query.getDecisionChangeStartDate() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getDecisionChangeStartDate()); queryBuffer.append(" l.decision.lastUpdate>=$" + (++counter)); }
if(query.getDecisionChangeEndDate() != null) { if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } parameters.add(counter, query.getDecisionChangeEndDate()); queryBuffer.append(" l.decision.lastUpdate<=$" + (++counter)); }
if(query.getStatus() != null) { List codes = retrieveStatusCodes(query.getStatus()); if(codes == null || codes.size() < 1) { throw new DataAccessException("Unable to retrieve status codes " + "for group " + query.getStatus()); } if(counter > 0) { queryBuffer.append(" AND"); } else { queryBuffer.append("WHERE"); } Iterator iter = codes.iterator(); queryBuffer.append(" ("); for(int i = 0; iter.hasNext(); i++) { StatusElement element = (StatusElement)iter.next(); parameters.add(counter, element.getStatus()); if(i > 0) { queryBuffer.append(" OR"); } queryBuffer.append(" l.status.type=$" + (++counter)); } queryBuffer.append(")"); }
Database db = null; try { db = getDatabase(); OQLQuery oql = db.getOQLQuery( "SELECT l " + "FROM com.loanapplication.LoanApplicationSummary l " + queryBuffer.toString() + " order by l.student.name.upperLast, " + "l.student.name.upperFirst, l.applicationId");
Iterator iter = parameters.iterator(); while(iter.hasNext()) { oql.bind(iter.next()); } db.setAutoStore(true); db.begin(); QueryResults results = oql.execute(Database.ReadOnly); List list = null; if(query.getMaxResults() > 0) { list = populateFromQueryResults(results, query.getMaxResults()); } else { list = populateFromQueryResults(results); } db.commit(); System.out.println("Query generated: " + list.size() + " results." ); return list; } catch(PersistenceException pe) { pe.printStackTrace(); try { db.rollback(); } catch(TransactionNotInProgressException tnipe) { // Ignore and report the initial cause. } throw new DataAccessException(pe.getMessage(), pe); } finally { try { releaseDatabase(db); } catch(PersistenceException pe) { // Must not be aquired. } } } // end findLoanApplication(Query)
<!-- Mapping for the LoanApplicationSummary --> <class name="com.loanapplication.LoanApplicationSummary" identity="applicationId">
<cache-type type="none"/> <map-to table="LOAN_APPLICATION"/> <field name="applicationId" type="long" > <sql name="OID" type="bigint"/> </field> <field name="status.type" type="string" > <sql name="STATUS_CD" type="longvarchar"/> </field> <field name="alternateDisbursement" type="string" > <sql name="ALTRNTE_DSBRSMNT" type="longvarchar" dirty="ignore"/> </field> <field name="complete" type="boolean" > <sql name="APP_COMPLETED_IND" type="bit" dirty="ignore"/> </field> <field name="statusChangeDate" type="date" > <sql name="STATUS_UPDATE_DATE" type="date" dirty="ignore"/> </field> <field name="year" type="string" > <sql name="ACADEMIC_YEAR" type="longvarchar" dirty="ignore"/> </field> <field name="school.name" type="string" > <sql name="SCHOOL_CD" type="longvarchar" dirty="ignore"/> </field> <field name="startDate" type="date" > <sql name="APP_START_DATE" type="date" dirty="ignore"/> </field> <field name="closeDate" type="date" > <sql name="DATE_CLOSED" type="date" dirty="ignore"/> </field> <field name="internalLiabilities" type="com.loanapplication.LiabilitySummary" collection="arraylist">
<sql many-key="P_LOAN_APPLICATION"/> </field>
<!-- Mapping for the Certification --> <field name="certification.certifiedDate" type="date"> <sql name="DATE_CERTIFIED" type="date" dirty="ignore"/> </field> <field name="certification.certifyingOfficer" type="string"> <sql name="CERTIFIED_BY" type="longvarchar" dirty="ignore"/> </field>
<!-- Mapping for the Decision --> <field name="decision.status" type="string"> <sql name="DECISION" type="longvarchar" dirty="ignore"/> </field> <field name="decision.lastUpdate" type="date"> <sql name="DECISION_UPDATE_DT" type="date" dirty="ignore"/> </field> <field name="decision.creditDecision.status" type="string"> <sql name="CREDIT_DECISION" type="longvarchar" dirty="ignore"/> </field>
<!-- Mapping for the Student --> <field name="student.studentId" type="long"> <sql name="STUDENT_ID" type="bigint" dirty="ignore"/> </field> <field name="student.name.first" type="string"> <sql name="STDT_FIRST_NAME" type="longvarchar" dirty="ignore"/> </field> <field name="student.name.upperFirst" type="string"> <sql name="UPPER_FIRST_NAME" type="longvarchar" dirty="ignore"/> </field> <field name="student.name.middle" type="string"> <sql name="STDT_MIDDLE_INITIAL" type="longvarchar" dirty="ignore"/> </field> <field name="student.name.last" type="string"> <sql name="STDT_LAST_NAME" type="longvarchar" dirty="ignore"/> </field> <field name="student.name.title.type" type="string"> <sql name="TITLE" type="longvarchar" dirty="ignore"/> </field> <field name="student.name.upperLast" type="string"> <sql name="UPPER_LAST_NAME" type="longvarchar" dirty="ignore"/> </field> <field name="student.ssn" type="string"> <sql name="STDT_SSN" type="longvarchar" dirty="ignore"/> </field> </class>
<!-- Mapping for LiabilitySummary --> <class name="com.loanapplication.LiabilitySummary" identity="id" depends="com.loanapplication.LoanApplicationSummary">
<cache-type type="none"/> <map-to table="LIABILITY"/> <field name="loanApplication" type="com.loanapplication.LoanApplicationSummary">
<sql name="P_LOAN_APPLICATION" dirty="ignore" /> </field> <field name="id" type="long"> <sql name="OID" type="bigint"/> </field> <field name="type" type="string"> <sql name="TYPE" type="longvarchar" dirty="ignore" /> </field> <field name="amount" type="integer"> <sql name="AMT" type="integer" dirty="ignore"/> </field> </class>
Thanks, Steve C
----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev
