Groovy withBatch真的很慢

时间:2017-05-06 00:49:50

标签: mysql groovy

我正在尝试使用Groovy withBatch函数,它真的很慢(15秒)。我尝试过不同的批量(10,400 ......),每批次都需要花费很多时间。

这是我用它写的第二个查询,并且都很慢。

这是我的代码。是否有错误或我使用错误的方式?

static updateCSProducts(def conn, def webProductRows){
conn.withBatch(400, """
    UPDATE cscart_products p 
    SET usergroup_ids=:usergroup_ids,
        b2b_group_ids=:b2b_group_ids,
        b2b_desc_hide=:b2b_desc_hide
    WHERE product_code = :product_code
        OR product_id = (SELECT product_id FROM cscart_product_options_inventory WHERE product_code = :product_code)
""") { ps ->
    webProductRows.each({row ->
        ProductType type = ProductType.fromCode(row.type)
        String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",")
        String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",")
        boolean b2bDescHide = !type.getB2bUserGroup().isEmpty()
        println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide
        ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide)
    })
}

}

我正在使用MySql作为数据库。当我在查看SQL连接时,在等待下一批时,我没有看到任何运行查询的连接。

编辑: 我删除了查询,但仍然很慢。 继续更新版本:

conn.withBatch(400, """
    UPDATE cscart_products p 
    SET usergroup_ids=:usergroup_ids,
        b2b_group_ids=:b2b_group_ids,
        b2b_desc_hide=:b2b_desc_hide
    WHERE p.product_code = :product_code    
""") { ps ->
    webProductRows.each({row ->
        ProductType type = ProductType.fromCode(row.type)
        String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",")
        String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",")
        String b2bDescHide = !type.getB2bUserGroup().isEmpty() ? 'Y' : 'N'
        println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide
        ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide)
    })
}

1 个答案:

答案 0 :(得分:0)

您在每次更新时都会运行大量查询。你最好还是检索一个数据列表然后循环它。它不是withBatch瓶颈,而是您的实施。