Runtime Issue === [TOC] ## SecServer: ##### last_d_date: 20201217 ### 1. o.h.e.jdbc.spi.SqlExceptionHelper - ORA-00001: unique constraint (NEWSEC.SYS_C00145381) violated > SEC_MSGMST > 移除過多的secMsgmstDO.save() [CommunicationBrService.sendMessage] ### 2. NEWSEC.SYS_C00143734 > SEC_MSGBAS ### 3. org.hibernate.internal.SessionImpl - HHH000346: Error during managed flush [could not execute statement] > 1. 移除全部flush:true ``` myDO.save(flush: true) <-- 移除flush ``` :::info ### 4. org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'null.replyFlag' ``` org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'null.replyFlag' at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at com.hcsaastech.ehis.sec.CommunicationBrService.$tt__findSecMsgMstBySqlWhere(CommunicationBrService.groovy:667) at com.hcsaastech.ehis.sec.CommunicationBrService$_findSecMsgMstBySqlWhere_closure11.doCall(CommunicationBrService.groovy) ``` ### 5. antlr.SemanticException: left-hand operand of a binary operator was null ``` antlr.SemanticException: left-hand operand of a binary operator was null at com.hcsaastech.ehis.sec.CommunicationBrService.$tt__findSecMsgMstBySqlWhere(CommunicationBrService.groovy:667) at com.hcsaastech.ehis.sec.CommunicationBrService$_findSecMsgMstBySqlWhere_closure11.doCall(CommunicationBrService.groovy) ``` ### 6. antlr.NoViableAltException: unexpected end of subtree ``` antlr.NoViableAltException: unexpected end of subtree at com.hcsaastech.ehis.sec.CommunicationBrService.$tt__findSecMsgMstBySqlWhere(CommunicationBrService.groovy:667) at com.hcsaastech.ehis.sec.CommunicationBrService$_findSecMsgMstBySqlWhere_closure11.doCall(CommunicationBrService.groovy) ``` :bulb: **Hint: use alias** > SecMsgbas.msgTo='012004' AND SecMsgbas.replyFlag='N' > t1.msgTo='012004' AND t1.replyFlag='N' ``` org.springframework.orm.hibernate5.HibernateQueryException: Invalid path: 'null.msgTo' [ select t from com.hcsaastech.ehis.sec.SecMsgmst t , com.hcsaastech.ehis.sec.SecMsgbas t1 where t1.secMsgmst=t.id and SecMsgbas.msgTo='012004' AND SecMsgbas.replyFlag='N' ]; nested exception is org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'null.msgTo' [ ``` ::: ### 7. java.lang.Exception: java.lang.Exception: java.lang.NullPointerException: Cannot get property 'properties' on null object >com.hcsaastech.common.utility.DTOTrans > private static def TransObject(def fromObj, def toObj, String packagePath, boolean fromDTOFlag) throws Exception { >> dtoObj.**properties**.keySet().each() { ... >> doObj.**properties**.containsKey(dtoProperty)) { ... >> 來源要做保護 ### 8. Optimistic Locking > 樂觀鎖gails預設是打開的, 透過每個domain 都以version 來control 順序性, 消極解法就是多做一次, (如果前後順序沒差的話) 這可以用橫切面來解, 但 其實可以disable 它, 可以試試看. ``` grails.gorm.default.mapping = { version false } ``` http://docs.grails.org/3.1.1/ref/Database%20Mapping/version.html https://stackoverflow.com/questions/27679114/disable-optimistic-locking-globally-in-grails/27683994 ### 9. o.h.e.jdbc.spi.SqlExceptionHelper - ORA-00001: unique constraint (NEWSEC.SYS_C00145381) violated > CommunicationBrService: ResultDTO sendMessage(SecMsgmstDTO secMsgmstDTO) { secMsgmstDTO.id=0 <- 建議補這行 ### 10. java.lang.ArrayIndexOutOfBoundsException: 1 ```java= SecSmslogBrImplService def sendNews(SecSmslogDAO secSmslogDAO) { ... secSmslogDAO.reportQuery.trim().split(";").each { replyUriBuilder.queryParam(it.split("=")[0], it.split("=")[1]) } ``` ### 11. java.sql.SQLSyntaxErrorException: ORA-00923: FROM keyword not found where expected > 參數要保護 ```java= PortalsBrImplService def findAllAxis2log(QueryDTO queryDTO) throws Exception { ``` ### 12. oracle.jdbc.OracleDatabaseException: ORA-01460: unimplemented or unreasonable conversion requested > TO_DATE format 錯誤 ```java= CommunicationBrService ... ResultDTO sendMessage(SecMsgmstDTO secMsgmstDTO) { ... def result = SecMsgmst.findAll { dateCreated >= startTime && dateCreated <= endTime && msgTo == secMsgmst.msgTo && msgTitle == secMsgmst.msgTitle && msgContent == secMsgmst.msgContent } ``` ## CommServer ##### last_d_date: 20201217 ### 1. org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not extract ResultSet; bad SQL grammar [n/a]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00936: missing expression > emrcodedtl0_.code_desc in () ```sql= Caused by: Error : 936, Position : 668, Sql = select emrcodedtl0_.id as id1_71_, emrcodedtl0_.version as version2_71_, emrcodedtl0_.code_desc as code_desc3_71_, emrcodedtl0_.code_no as code_no4_71_, emrcodedtl0_.code_type as code_type5_71_, emrcodedtl0_.created_by as created_by6_71_, emrcodedtl0_.date_created as date_created7_71_, emrcodedtl0_.emrcodemst_id as emrcodemst_id8_71_, emrcodedtl0_.enabled as enabled9_71_, emrcodedtl0_.eng_desc as eng_desc10_71_, emrcodedtl0_.last_updated as last_updated11_71_, emrcodedtl0_.last_updated_by as last_updated_by12_71_, emrcodedtl0_.remark_desc as remark_desc13_71_ from EMR.EMR_CODEDTL emrcodedtl0_ where emrcodedtl0_.code_type='antiBExamOrder' and (emrcodedtl0_.code_desc in ()) and emrcodedtl0_.enabled='Y', OriginalSql = select emrcodedtl0_.id as id1_71_, emrcodedtl0_.version as version2_71_, emrcodedtl0_.code_desc as code_desc3_71_, emrcodedtl0_.code_no as code_no4_71_, emrcodedtl0_.code_type as code_type5_71_, emrcodedtl0_.created_by as created_by6_71_, emrcodedtl0_.date_created as date_created7_71_, emrcodedtl0_.emrcodemst_id as emrcodemst_id8_71_, emrcodedtl0_.enabled as enabled9_71_, emrcodedtl0_.eng_desc as eng_desc10_71_, emrcodedtl0_.last_updated as last_updated11_71_, emrcodedtl0_.last_updated_by as last_updated_by12_71_, emrcodedtl0_.remark_desc as remark_desc13_71_ from EMR.EMR_CODEDTL emrcodedtl0_ where emrcodedtl0_.code_type='antiBExamOrder' and (emrcodedtl0_.code_desc in ()) and emrcodedtl0_.enabled='Y', Error Msg = ORA-00936: missing expression ``` ### 2. java.lang.NullPointerException: Cannot set property 'displayName' on null object ### 3. CommMedReplaceService.findAllCMRDByQuery Exception: null ### 4. callWso2EsbResult throw exception ### 5. exception when export report: No input source supplied to the exporter. ### 6. exception when fill report: Error executing SQL statement for : PHM6140-1Hcaemr ### 7. exception when fill report: Error executing SQL statement for : PHM6110Hcaemr ### 8. CommMedReplaceService.getSurplusAmount Exception: Closed Connection ### 9. CommMedReplaceService.getChronicKeepQty Exception: Closed Connection ### 10. Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 > version false ## Hibernate setMaxResult() ### 從Hibernate StatementInspector 去攔截 ### 1. application.grooy ``` sql { inspector{ enable = true query_max_results = 1 } } ``` ### 2. application.yml ```yaml= hibernate: show_sql: true # use_sql_comments: true # format_sql: true session_factory: statement_inspector: com.hcsaastech.ehis.xxxxx.SQLInspector cache: queries: false use_second_level_cache: true use_query_cache: false region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory ``` ### 3. SQLInspector ```java= import grails.util.Holders import groovy.util.logging.Slf4j import org.hibernate.resource.jdbc.spi.StatementInspector @Slf4j class SQLInspector implements StatementInspector { private static final String STMT_SELECT_ONLY = "(?i)(?=.*\\s*select\\s+)^(?!.*\\s+insert\\s+)^(?!.*\\s+update\\s+)^(?!.*\\s+delete\\s+).*"; @Override public String inspect(String sql) { def enable = Holders.config.sql.inspector.enable def query_max_results = Holders.config.sql.inspector.query_max_results log.info "sql.inspector.enable: ${enable}" log.info "sql.inspector.enable: ${query_max_results}" if(enable) { if(sql.matches(STMT_SELECT_ONLY)) { StringBuffer sb = new StringBuffer(); sb.append("SELECT * FROM ( ").append(sql).append(" ) WHERE ROWNUM <= ${query_max_results} "); sql = sb.toString() } } return sql } } ``` ## DB Lock ### find db lock by date ```sql= SELECT T.sql_id, count(1), (SELECT PARSING_SCHEMA_NAME FROM v$sql WHERE sql_id=T.sql_id AND rownum=1) schema_name, (SELECT sql_text FROM v$sql WHERE sql_id=T.sql_id AND rownum=1) sql_text FROM ( SELECT count(1),session_id,"SESSION_SERIAL#" ,BLOCKING_SESSION,"BLOCKING_SESSION_SERIAL#" ,event,sql_id FROM "GV$ACTIVE_SESSION_HISTORY" WHERE BLOCKING_SESSION IS NOT NULL AND sample_time >sysdate -6/24 AND event LIKE '%TX%' GROUP BY session_id,"SESSION_SERIAL#" ,BLOCKING_SESSION,BLOCKING_SESSION_SERIAL#,event,sql_id ORDER BY 7 )T GROUP BY T.sql_id ORDER BY count(1) desc ``` ```sql= select username, sum(decode(substr(sql_exec_start,12,2),'00',1,0)) as "h00", sum(decode(substr(sql_exec_start,12,2),'01',1,0)) as "h01", sum(decode(substr(sql_exec_start,12,2),'02',1,0)) as "h02", sum(decode(substr(sql_exec_start,12,2),'03',1,0)) as "h03", sum(decode(substr(sql_exec_start,12,2),'04',1,0)) as "h04", sum(decode(substr(sql_exec_start,12,2),'05',1,0)) as "h05", sum(decode(substr(sql_exec_start,12,2),'06',1,0)) as "h06", sum(decode(substr(sql_exec_start,12,2),'07',1,0)) as "h07", sum(decode(substr(sql_exec_start,12,2),'08',1,0)) as "h08", sum(decode(substr(sql_exec_start,12,2),'09',1,0)) as "h09", sum(decode(substr(sql_exec_start,12,2),'10',1,0)) as "h10", sum(decode(substr(sql_exec_start,12,2),'11',1,0)) as "h11", sum(decode(substr(sql_exec_start,12,2),'12',1,0)) as "h12", sum(decode(substr(sql_exec_start,12,2),'13',1,0)) as "h13", sum(decode(substr(sql_exec_start,12,2),'14',1,0)) as "h14", sum(decode(substr(sql_exec_start,12,2),'15',1,0)) as "h15", sum(decode(substr(sql_exec_start,12,2),'16',1,0)) as "h16", sum(decode(substr(sql_exec_start,12,2),'17',1,0)) as "h17", sum(decode(substr(sql_exec_start,12,2),'18',1,0)) as "h18", sum(decode(substr(sql_exec_start,12,2),'19',1,0)) as "h19", sum(decode(substr(sql_exec_start,12,2),'20',1,0)) as "h20", sum(decode(substr(sql_exec_start,12,2),'21',1,0)) as "h21", sum(decode(substr(sql_exec_start,12,2),'22',1,0)) as "h22", sum(decode(substr(sql_exec_start,12,2),'23',1,0)) as "h23" from ( select c.username,c.sql_exec_start, max(ceil((to_date(block_end_time, 'YYYY-MM-DD HH24:MI:SS') - to_date(sql_exec_start , 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60)) block_sec from ( SELECT t.username, t.sql_id, t.session_id,t.session_serial#,t.BLOCKING_SESSION,t.BLOCKING_SESSION_SERIAL#,to_char(t.sql_exec_start,'YYYY-MM-DD HH24:MI:SS') sql_exec_start,block_end_time, (SELECT sql_text FROM v$sql WHERE sql_id=T.sql_id AND rownum=1) sql_text FROM ( SELECT b.username,a.session_id,a.SESSION_SERIAL# ,a.BLOCKING_SESSION, a.BLOCKING_SESSION_SERIAL# ,a.event,sql_id, a.sql_exec_start,to_char(max(a.sample_time),'YYYY-MM-DD HH24:MI:SS') block_end_time FROM "GV$ACTIVE_SESSION_HISTORY" a, dba_users b WHERE a.BLOCKING_SESSION IS NOT NULL and b.user_id = a.user_id AND to_char(a.sql_exec_start,'YYYY-MM-DD') = '2021-01-18' AND a.event LIKE '%TX%' GROUP BY b.username, a.session_id, a.SESSION_SERIAL# ,a.BLOCKING_SESSION, a.BLOCKING_SESSION_SERIAL#, a.event,sql_id, a.sql_exec_start )t GROUP BY t.username, t.sql_id, t.session_id, t.session_serial# ,t.BLOCKING_SESSION, t.BLOCKING_SESSION_SERIAL#, t.sql_exec_start, block_end_time order by sql_exec_start) c group by c.username, c.sql_exec_start having max(ceil((to_date(block_end_time, 'YYYY-MM-DD HH24:MI:SS') - to_date(sql_exec_start , 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60)) > 1 and max(ceil((to_date(block_end_time, 'YYYY-MM-DD HH24:MI:SS') - to_date(sql_exec_start , 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60)) < 61) d group by username ; ```