#1
This guide shows how to perform batch inserts in ClickHouse with Spring Boot for faster and efficient data ingestion.

1. Configure JDBC for Batch Inserts

Add dependency:
<dependency>
  <groupId>com.clickhouse</groupId>
  <artifactId>clickhouse-jdbc</artifactId>
  <version>0.3.2-patch</version>
</dependency>
Set datasource properties:
spring.datasource.url=jdbc:clickhouse://localhost:8123/default
spring.datasource.driver-class-name=com.clickhouse.jdbc.ClickHouseDriver
spring.jpa.properties.hibernate.jdbc.batch_size=1000

2. Define an Entity

@Entity
@Table(name = "events")
public class Event {
    @Id
    private Long id;
    private String type;
    private LocalDateTime timestamp;
}

3. Repository Interface

public interface EventRepository extends JpaRepository<Event, Long> {}

4. Batch Insert with saveAll

List<Event> events = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    Event e = new Event();
    e.setId((long) i);
    e.setType("CLICK");
    e.setTimestamp(LocalDateTime.now());
    events.add(e);
}
repo.saveAll(events);

5. Using JdbcTemplate for Faster Inserts

@Autowired
private JdbcTemplate jdbcTemplate;

public void batchInsert(List<Event> events) {
    jdbcTemplate.batchUpdate(
        "INSERT INTO events (id, type, timestamp) VALUES (?, ?, ?)",
        events,
        1000,
        (ps, event) -> {
            ps.setLong(1, event.getId());
            ps.setString(2, event.getType());
            ps.setTimestamp(3, Timestamp.valueOf(event.getTimestamp()));
        }
    );
}

6. Tips for Performance

  • Use saveAll for simplicity.
  • Use JdbcTemplate batch updates for high throughput.
  • Adjust hibernate.jdbc.batch_size based on workload.

image quote pre code