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