Spring SimpleJdbcTemplate:java.lang.OutOfMemoryError:超出了GC开销限制

时间:2011-07-27 08:42:18

标签: java oracle spring jdbc garbage-collection

我正在将我的脚趾浸入Spring中,并且我一直在使用SimpleJdbcTemplate来帮助减少我需要编写的代码量,但我现在遇到一个问题,即异常“java.lang.OutOfMemoryError:GC开销超出限制“被抛出。我一直在使用他们的网络服务从eBay中提取类别,我使用调用jdbTemplate.update插入每个类别(我认为大约10,000条记录)(见下面的代码)

CategoryService:

// If the category already exist (i.e. an error is throuwn as the version must be unique) than do now bother sotring the categories
for(CategoryType ct : categories)
{
    try
    {
        // TODO: Determine why a child ategory can be tied to multiple parents, for now just use the first category in the array
        categoryDao.SaveCategory(ct.getCategoryID(), ct.getCategoryName(), ct.getCategoryParentID()[0]);
    }
    catch(DuplicateKeyException e)
    {
        // No problem here, the version description is the same... just continue as if nothing happened
    }
}

CategoryDaoImpl :( CategoryDao接口的实现)

@Override
public int SaveCategory(String ebayCategoryId, String ebayCategoryName, String ebayParentCategoryId) 
{
    // Firstly grab the next value in the categoru sequence
    int internalCategoryId = jdbcTemplate.queryForInt(categorySequenceStatement);

    // Insert the new category
    jdbcTemplate.update(insertCategoryStatement, new Object[] {internalCategoryId, ebayCategoryId, ebayCategoryName, ebayParentCategoryId});

    return internalCategoryId;
}

环境:

  • Spring Framework 3.0.2
  • Oracle数据库XE(我认为11g!)(使用ojdbc6.jar)
  • JDK(jdk1.6.0_26)

我曾在SimpleJdbcTemplate上使用batchUpdate方法,但我不确定这里是否存在潜在问题。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

立即停止将所有类别加载到内存中。处理每个类别。它将至少快一个数量级,不会导致OOME。