我有一个Java应用程序,可从Oracle 11g数据库11.2.0.4.0版(使用Spring 4)提取大型xml并将其存储在文件中。我们在提取包含多字节字符的数据时遇到问题。根据多字节在xml中的位置,有时会将多字节分成两部分。看来问题出在与jdbc的版本和安装的oracle客户端有关。因此,我们迁移到Oracle客户端18和ojdb8.jar,使代码保持不变。多字节问题已解决,但是现在我们遇到了以前未发生的内存问题。我得到的错误是:
我玩过java命令参数,但无济于事。这就是我正在运行的内容:java -Dfile.encoding = UTF8 -Doracle.jdbc.timezoneAsRegion = false -Xmx10240m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / tmp -XX:NativeMemoryTracking = detail -XX:+ StartAttachListener -XX: + UnlockDiagnosticVMOptions -XX:+ PrintNMTStatistics
Xmx减少到512m最终导致堆内存不足。
我使用jcmd VM.native_memorybaseline / summary.diff和GC.class_stats监视了应用程序的内存,最大的内存使用者之一是String对象。我无法理解其余的一切。
的SQL是:SELECT XML_DATA FROM table where ....
xml_data列定义为:XML_DATA NOT NULL SYS.XMLTYPE STORAGE BINARY
在Java中将此映射到oracle.xdb.XMLType:
public List<XMLType> extractXmlDataList(String sqlExtractionQuery, Key key) {
MapSqlParameterSource namedSqlParams = createKeyParamMap(key);
List<XMLType> dataList = namedParameterJdbcTemplate.queryForList(sqlExtractionQuery, namedSqlParams, XMLType.class);
return dataList;
}
protected void extractXmlData(Key key) {
List<XMLType> xmlRecs = producerDao.extractXmlDataList(sqlExtractionQuery, patentKey);
if (xmlRecs != null && xmlRecs.size() > 0) {
for (XMLType xmlData : xmlRecs) {
String xmlText = xmlData.getStringVal();
//create nu.xom.Document
Builder parser = new Builder();
Document xmlDocument = parser.build(xmlText, null);
}
}
}
迁移到Oracle客户端18和jdbc8.jar怎么会对内存消耗产生如此大的影响?
通过使用xmlserialize而不是Oracle Java XMLType对象解决了内存问题。仍在使用Oracle客户端18和ojdbc8.jar。多字节UTF8拆分没有其他问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句