Java namedParameterJdbcTemplate批量更新vs插入选择

Java namedParameterJdbcTemplate批量更新vs插入选择,java,postgresql,jdbc,performance-testing,jsonb,Java,Postgresql,Jdbc,Performance Testing,Jsonb,我正在做一个实验,我想看看在PostgreSQL数据库中插入多条记录的方法能给我带来最好的速度性能。我使用的是“PostgreSQL 1800, 64,1.8 C++ + java + +Postgres JDBC驱动程序:94.077./P>> 本实验的表定义如下: CREATE TABLE mytable (ea VARCHAR(256) NOT NULL, ehv CHAR(60) NOT NULL); ALTER TABLE mytable ADD CONSTRAINT pk_myta

我正在做一个实验,我想看看在PostgreSQL数据库中插入多条记录的方法能给我带来最好的速度性能。我使用的是“PostgreSQL 1800, 64,1.8 C++ + java + +Postgres JDBC驱动程序:94.077./P>> 本实验的表定义如下:

CREATE TABLE mytable (ea VARCHAR(256) NOT NULL, ehv CHAR(60) NOT NULL);

ALTER TABLE mytable ADD CONSTRAINT pk_mytable_ea PRIMARY KEY (ea);
第一种方法是执行
executeBatch
,其中我创建了参数映射列表。代码如下所示:

public void executeBatch(List<MyObject> myObjects) {
        final String sql = "INSERT INTO mytable(" +
                "    ea, ehv) " +
                "    VALUES (:ea, :ehv) ";

        MapSqlParameterSource[] params = new MapSqlParameterSource[myObjects.size()];
        for (int i = 0; i < myObjects.size(); i++) {
            params[i] = new MapSqlParameterSource()
                    .addValue("ea", myObjects.get(i).getEa())
                    .addValue("ehv", myObjects.get(i).getEhv());
        }

        jdbcTemplate.batchUpdate(sql, params);
    }
我在下面的测试中比较了这两种方法,我创建了10000个MyObject

@Test
    public void test() throws JsonProcessingException, RepositoryException {
        List<MyObject> myObjects = new ArrayList(10000);
        for(int i = 0; i < 10000; i++) {
            myObjects.add(new MyObject(i + "ea", i + "ehv"));
        }

        long before = System.currentTimeMillis();
        censusRepository.executeBatch(myObjects);
        long after = System.currentTimeMillis();
        System.out.println("executeBatch Took - " + (after-before));

        namedParameterJdbcTemplate.update("delete from mytable", new MapSqlParameterSource());

        before = System.currentTimeMillis();
        censusRepository.insertFromString(myObjects);
        after = System.currentTimeMillis();
        System.out.println("insertFromString Took - " + (after-before));

        namedParameterJdbcTemplate.update("delete from mytable", new MapSqlParameterSource());
    }
是什么原因导致第二种方法的性能比
executeBatch
好得多?根据你的经验,我应该采取哪种方法。你能推荐另一个能给我更好表现的吗?我有以下限制-我将向数据库中插入1000个MyObject的批次,每个MyObject包含两个字符串值。

插入到。。。选择
插入到。。。值(…),(…)…插入到。。。值(…)。几乎总是这样。执行多个语句会增加每个语句的通信、准备等成本。将多个参数绑定到单个语句。请参见f.ex。
@Test
    public void test() throws JsonProcessingException, RepositoryException {
        List<MyObject> myObjects = new ArrayList(10000);
        for(int i = 0; i < 10000; i++) {
            myObjects.add(new MyObject(i + "ea", i + "ehv"));
        }

        long before = System.currentTimeMillis();
        censusRepository.executeBatch(myObjects);
        long after = System.currentTimeMillis();
        System.out.println("executeBatch Took - " + (after-before));

        namedParameterJdbcTemplate.update("delete from mytable", new MapSqlParameterSource());

        before = System.currentTimeMillis();
        censusRepository.insertFromString(myObjects);
        after = System.currentTimeMillis();
        System.out.println("insertFromString Took - " + (after-before));

        namedParameterJdbcTemplate.update("delete from mytable", new MapSqlParameterSource());
    }
executeBatch Took - 464ms
insertFromString Took - 253ms