[ODI] org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
1. Overview
ODI Studio 에서 JMS XML Queue 의 Data를 Load 할 때,
다음과 같은 예외가 발생한다.
1
2
3
ODI-1228: Task Procedure-<Procedure>-Load JMS fails on the target connection <Schema Name>.
Caused by: java.sql.SQLException: class java.sql.SQLException
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 3012785; XML document structures must start and end within the same entity.
2. Descriptions
실제 사례는, WebLogic에 구현된 JMS Queue에서 XML Data를 ODI Studio로 Load 하는 과정에서 발생했다.
ODI Studio는 JMS XML Data를 Load 할 때, 기본적으로 연속된 4개의 세미콜론(;
) 구분자로 컬럼 단위로 In-memory Load 를 수행한다.
읽는 Data 자체에 연속된 4개의 세미콜론이 사용자 데이터로 존재하여, Parsing 예외가 발생했다.
24.2.2 Technology Specific Requirements 의 설명에 따르면, 이미 기본 Release에 위와 같은 상황을 위하여 oracle.odi.jmsxmlColSepString
옵션이 포함되어 있으나, 해당 옵션으로도 해결이 되지 않았다.
조사 결과,
ODI Studio가 Data를 Read할 때, JMSXMLPreparedStatement
객체를 사용할 때 발생한 문제였으며, 이는 위 문서 설명처럼 Fixed 되었다.
그러나, 이번 사례는, JMSXMLStatement
객체를 사용할 때 발생한 문제였다.
왜, 이전에 Statement 클래스만 수정했는지는 알 수 없다.
이번 문제를 해결 하기 위해서는, 다음의 순서로 패치를 진행한다.
- OPatch upgrade
- ODI Stack Patch Bundle
- Patch 37198852 (Reading from JMS XML: The Java property “oracle.odi.jmsxmlColSepString” is ignored)
패치 후에는, Studio/Agent 에 각각 옵션을 사용해야 한다.
24.2.2 Technology Specific Requirements 참고
- Studio (
${ORACLE_HOME}/odi/studio/bin/odi.conf
)AddVMOption -Doracle.odi.jmsxmlColSepString="$$$$"
- Agent
JAVA_OPTIONS="${JAVA_OPTIONS} -Doracle.odi.jmsxmlColSepString=\$\$\$\$"
- 여기서는 $ 기호를 사용했으나, 사용자의 선택에 달려 있고, $ 기호는 Unix/Linux 에서 특수기호이므로 Escape 처리를 해야 한다.