Support query retry on ConcurrencyFailureException

XMLWordPrintable

    • Type: Improvement
    • Resolution: Fixed
    • Priority: Major
    • Component/s: SolarQuery
    • None

      When SolarQuery is configured to query a read-only streaming replica database, it sometimes encounters a org.springframework.dao.ConcurrencyFailureException exception. This exception should be caught and the query re-tried automatically at least one more time. An example exception is:

      org.springframework.dao.ConcurrencyFailureException: ### Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed. ### The error may exist in OSGi resource[classpath:/net/solarnetwork/central/datum/dao/mybatis/map/GeneralNodeDatum.xml|bnd.id=182|bnd.sym=net.solarnetwork.central.datum.dao.mybatis] ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT datum.ts_start AS r_datum_ts_start, datum.local_date AS r_datum_local_date, datum.node_id AS r_datum_node_id, datum.source_id AS r_datum_source_id, datum.jdata AS r_datum_jdata FROM solaragg.agg_datum_hourly_data datum WHERE datum.source_id = ANY(?) AND datum.node_id = ANY(?::bigint[]) AND datum.ts_start >= ? AND datum.ts_start < ? ORDER BY r_datum_ts_start, r_datum_node_id, r_datum_source_id ### Cause: org.postgresql.util.PSQLException: ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed. ; SQL []; ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed.; nested exception is org.postgresql.util.PSQLException: ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed. 
          at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:111) 
          at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
          at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
          at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
          at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 
          at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) 
          at com.sun.proxy.$Proxy90.selectList(Unknown Source) 
          at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:238) 
          at net.solarnetwork.central.dao.mybatis.support.BaseMyBatisDao.selectList(BaseMyBatisDao.java:81) 
          at net.solarnetwork.central.datum.dao.mybatis.MyBatisGeneralNodeDatumDao.findAggregationFiltered(MyBatisGeneralNodeDatumDao.java:561) 
          at net.solarnetwork.central.datum.dao.mybatis.MyBatisGeneralNodeDatumDao.findAggregationFiltered(MyBatisGeneralNodeDatumDao.java:81) 
      

            Assignee:
            Matt Magoffin
            Reporter:
            Matt Magoffin
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: