-
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)