Java namedParameterJdbcTemplate批量更新vs插入选择
我正在做一个实验,我想看看在PostgreSQL数据库中插入多条记录的方法能给我带来最好的速度性能。我使用的是“PostgreSQL 1800, 64,1.8 C++ + java + +Postgres JDBC驱动程序:94.077./P>> 本实验的表定义如下: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
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