[hibernate-issues] [Hibernate-JIRA] Created: (HHH-2243) Statement closing due to unprovoked rollback
Theresa (JIRA)
noreply at atlassian.com
Wed Nov 15 17:22:07 EST 2006
Statement closing due to unprovoked rollback
--------------------------------------------
Key: HHH-2243
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2243
Project: Hibernate3
Type: Bug
Components: core
Versions: 3.1.3
Environment: postgresql, hibernate 3.1.3, and apache DBCP
Reporter: Theresa
Has there been a resolution to the issue described at http://opensource.atlassian.com/projects/hibernate/browse/HHH-876?
I have seen closed statement errors sporadically occurring and I can't get it under control. Even when the last execution of the statement is successful in a recursive loop reusing the statement, I can still see this happen. The stack and code is below. I am very curious how the rollback is getting called. There are several more places in the code where this is occurring. It is odd that it only happens sporadically and I have only identified 2 places out of a couple of dozen that actually causes this to occur.
**************CONFIG********************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost/myDB</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.transaction.factory_class ">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.DBCPConnectionProvider</property>
<!-- Not specified with 3rd party connection pool <property name="connection.pool_size">20</property>-->
<property name="hibernate.dbcp.maxActive">3</property>
<property name="hibernate.dbcp.maxIdle">3</property>
<property name="hibernate.dbcp.max Wait">60000</property>
<property name="hibernate.dbcp.whenExhaustedAction">1</property>
<property name="hibernate.dbcp.ps.maxActive">3</property>
<property name="hibernate.dbcp.ps.maxIdle">3</property>
<property name="hibernate.dbcp.ps.maxWait">1000*20</property>
<property name="hibernate.dbcp.ps.whenExhaustedAction">1</property>
<property name="hibernate.connection.release_mode">after_transaction</property>
<property name="hibernate.dbcp.poolPreparedStatements">true</property>
</session-factory>
</hibernate-configuration>
********************CODE**************
private synchronized HashMap<Integer, LeadDeliveryPreferences> queryForPreferences() throws SQLException{
// we open a session because this quartz group seems to have an
// issue retrieving the session on the first job execution
Session hibSession = HibernateUtil.getSessionFactory().openSession();
hibSession.beginTransaction();
Connection conn = hibSession.connection();
HashMap<Integer, LeadDeliveryPreferences> allMap =
new HashMap<Integer, LeadDeliveryPreferences>();
try{
PreparedStatement stmt = conn.prepareStatement(QUERY_ALL_PREF);
ResultSet rs = stmt.executeQuery();
//Query for lead delivery preferences
while(rs.next()){
LeadDeliveryPreferences lp = new LeadDeliveryPreferences();
lp.setCampaignID(rs.getInt(LeadDeliveryPreferences.DB_CAMPAIGN_ID));
lp.setCronSchedule(rs.getString(LeadDeliveryPreferences.DB_CRON_SCHEDULE));
lp.setEmail(rs.getString(LeadDeliveryPreferences.DB_EMAIL));
lp.setDeliveryEnabled(rs.getBoolean(LeadDeliveryPreferences.DB_DELIVERY_ENABLED));
lp.setDeliveryTransformer(rs.getString(LeadDeliveryPreferences.DB_DELIVERY_TRANSFORMER));
lp.setReportEnabled(rs.getBoolean(LeadDeliveryPreferences.DB_REPORT_ENABLED));
lp.setReportType(rs.getString(LeadDeliveryPreferences.DB_REPORT_TYPE));
lp.setSource(rs.getString(LeadDeliveryPreferences.DB_SOURCE));
allMap.put(rs.getInt(LeadDeliveryPreferences.DB_CAMPAIGN_ID), lp);
log_.debug("Picked up schedule for campaign: " + rs.getInt(LeadDeliveryPreferences.DB_CAMPAIGN_ID));
}
//prepare statement object for re-use
//stmt.clearParameters();
//Query for crosswalk values
Iterator it = allMap.keySet().iterator();
ArrayList<Integer> idList = new ArrayList<Integer>();
while(it.hasNext()){
idList.add((Integer)it.next());
}
PreparedStatement stmt2 = conn.prepareStatement(QUERY_TRANSLATIONS);
for(int i=0;i<idList.size();i++){
log_.debug("Getting crosswalk for --> " + idList.get(i));
stmt2.setInt(1,idList.get(i));
ResultSet rs2 = stmt2.executeQuery();
LeadDeliveryPreferences lp = allMap.get(idList.get(i));
while(rs2.next()){
LeadCrosswalk lc = new LeadCrosswalk();
log_.debug("got key --> " + rs2.getString(LeadCrosswalk.DB_NAME_COL_NM));
lc.setName(rs2.getString(LeadCrosswalk.DB_NAME_COL_NM));
lc.setIsMethod(rs2.getBoolean(LeadCrosswalk.DB_IS_METHOD_COL_NM));
lc.setNameTranslation(rs2.getString(LeadCrosswalk.DB_NAME_TRANSLATION_COL_NM));
lc.setIsRequired(rs2.getBoolean(LeadCrosswalk.DB_IS_REQUIRED_COL_NM));
lp.addCrosswalk(lc.getName(), lc);
}
// prepare statement object for re-use
stmt2.clearParameters();
allMap.remove(idList.get(i));
allMap.put(idList.get(i), lp);
}
//Query for phone ranges
PreparedStatement stmt3 = conn.prepareStatement(QUERY_PHONE_RANGES);
for(int i=0;i<idList.size();i++){
stmt3.setInt(1, idList.get(i));
rs = stmt3.executeQuery();
LeadDeliveryPreferences lp = allMap.get(idList.get(i));
while(rs.next()){
LeadDeliveryClientPhoneRanges phoneRange = new LeadDeliveryClientPhoneRanges();
phoneRange.setLow(rs.getInt(LeadDeliveryClientPhoneRanges.DB_LOW));
phoneRange.setHigh(rs.getInt(LeadDeliveryClientPhoneRanges.DB_HIGH));
phoneRange.setLabel(rs.getString(LeadDeliveryClientPhoneRanges.DB_LABEL));
log_.debug("Added phone range " + phoneRange.getLabel());
lp.addPhoneRange(phoneRange);
}
allMap.remove(idList.get(i));
allMap.put(idList.get(i), lp);
}
hibSession.getTransaction().commit();
}
catch(SQLException se){
hibSession.getTransaction().rollback();
log_.error("SQLException occured querying for crosswalk", se);
RuntimeErrorEmailHelper.addMessage("Error creating cron trigger");
throw se;
}
return allMap;
}
****************STACK******************
2006-11-15 13:56:02,892 [DefaultQuartzScheduler_Worker-8] DEBUG leads.delivery.LeadDeliveryPreferencesService - Getting crosswalk for --> 200
2006-11-15 13:56:02,899 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.transaction.JDBCTransaction - rollback
2006-11-15 13:56:02,912 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.transaction.JDBCTransaction - rolled back JDBC Connection
2006-11-15 13:56:02,912 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.jdbc.JDBCContext - after transaction completion
2006-11-15 13:56:02,912 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.jdbc.ConnectionManager - aggressively releasing JDBC connection
2006-11-15 13:56:02,912 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 1) (open ResultSets: 0, globally: 0)]
2006-11-15 13:56:02,913 [DefaultQuartzScheduler_Worker-8] INFO hibernate.connection.DBCPConnectionProvider - active: 3 (max: 3) idle: 0(max: 3)
2006-11-15 13:56:02,913 [DefaultQuartzScheduler_Worker-8] DEBUG hibernate.impl.SessionImpl - after transaction completion
2006-11-15 13:56:02,915 [DefaultQuartzScheduler_Worker-8] ERROR leads.delivery.LeadDeliveryPreferencesService - SQLException occured querying for crosswalk
2006-11-15 13:56:02,920 [DefaultQuartzScheduler_Worker-8] INFO quartz.core.JobRunShell - Job LEAD_PREFERENCES.PREFERENCES_UPDATE_JOB threw a JobExecutionException:
org.quartz.JobExecutionException: org.postgresql.util.PSQLException: This statement has been closed. [See nested exception: org.postgresql.util.PSQLExcepti
on: This statement has been closed.]
at com.tippit.service.leads.delivery.LeadDeliveryPreferencesService.execute(LeadDeliveryPreferencesService.java:185)
at org.quartz.core.JobRunShell.run(JobRunShell.java:195)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
* Nested Exception (Underlying Cause) ---------------
org.postgresql.util.PSQLException: This statement has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Statement.checkClosed(AbstractJdbc2Statement.java:2308)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setInt(AbstractJdbc2Statement.java:1070)
at org.apache.commons.dbcp.DelegatingPreparedStatement.setInt(DelegatingPreparedStatement.java:116)
at org.apache.commons.dbcp.DelegatingPreparedStatement.setInt(DelegatingPreparedStatement.java:116)
at com.tippit.service.leads.delivery.LeadDeliveryPreferencesService.queryForPreferences(LeadDeliveryPreferencesService.java:116)
at com.tippit.service.leads.delivery.LeadDeliveryPreferencesService.load(LeadDeliveryPreferencesService.java:61)
at com.tippit.service.leads.delivery.LeadDeliveryPreferencesService.execute(LeadDeliveryPreferencesService.java:181)
at org.quartz.core.JobRunShell.run(JobRunShell.java:195)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list