ClickHouse資料庫簡介
1. 概述
透過使用線上分析處理 (OLAP),企業可以深入了解當前的營運狀況並確定改善趨勢。這通常是透過對聚合的業務資料執行複雜的分析來完成的。
ClickHouse是一個開源的面向列的OLAP資料庫,最近因其優異的效能而受到歡迎。
在本教程中,我們將探索將 ClickHouse 資料庫整合到 Spring Boot 應用程式中。我們將完成必要的配置,建立連接,並對資料庫表執行一些 CRUD 操作。
2. 設定項目
在開始與 ClickHouse 資料庫互動之前,我們需要包含一些 SDK 依賴項並正確配置我們的應用程式。
2.1.依賴關係
讓我們先將必要的依賴項新增到專案的pom.xml檔案中:
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.7.1</version>
</dependency>
<dependency>
<groupId>org.lz4</groupId>
<artifactId>lz4-java</artifactId>
<version>1.8.0</version>
</dependency>
clickhouse-jdbc依賴項提供了 JDBC API 的實現,使我們能夠與 ClickHouse 資料庫建立連線並與其互動。
預設情況下,ClickHouse 使用 LZ4 壓縮來儲存數據,為此我們添加了[lz4-java](https://mvnrepository.com/artifact/org.lz4/lz4-java/)依賴。
2.2.使用 Flyway 定義資料庫表
接下來,讓我們定義我們將對其執行操作的資料庫表。
我們將使用 Flyway 來管理我們的資料庫遷移。讓我們包含flyway-core和flyway-database-clickhouse依賴項:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-database-clickhouse</artifactId>
<version>10.16.3</version>
</dependency>
將這些依賴項新增至pom.xml後,我們將在src/main/resources/db/migration目錄中建立一個名為V001__create_table.sql的遷移腳本,其中包含以下內容:
CREATE TABLE authors (
id UUID,
name String,
email String,
created_at DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id;
我們的腳本建立一個authors表,以id為主鍵和一些其他列。我們使用MergeTree表引擎,它針對插入和查詢效能進行了最佳化。
2.3.資料模型
最後,我們將建立一個Author記錄來表示authors表中的資料:
public record Author(
UUID id,
String name,
String email,
LocalDateTime createdAt) {
public static Author create(String name, String email) {
return new Author(
UUID.randomUUID(),
name,
email,
LocalDateTime.now()
);
}
}
我們還添加了一個靜態create()方法,以使用隨機UUID和當前時間戳來實例化我們的Author記錄。
3. 使用測試容器設定本機測試環境
為了促進本地開發和測試,我們將使用 Testcontainers 來設定 ClickHouse 資料庫。
透過 Testcontainers 運行資料庫的先決條件是一個活動的 Docker 實例。
3.1.測試依賴關係
首先,讓我們將必要的測試依賴項新增到pom.xml中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>clickhouse</artifactId>
<scope>test</scope>
</dependency>
spring-boot-testcontainers和clickhouse testcontainers 模組依賴項提供了為 ClickHouse 資料庫啟動臨時 Docker 實例所需的類別。
3.2.定義測試容器 Bean
接下來,讓我們建立一個@TestConfiguration類別來定義我們的 Testcontainers beans:
`@TestConfiguration(proxyBeanMethods = false)
class TestcontainersConfiguration {
@Bean
public ClickHouseContainer clickhouseContainer() {
return new ClickHouseContainer("clickhouse/clickhouse-server:24.11");
}
@Bean
public DynamicPropertyRegistrar dynamicPropertyRegistrar(ClickHouseContainer clickhouseContainer) {
return registry -> {
registry.add("spring.datasource.url", clickhouseContainer::getJdbcUrl);
registry.add("spring.datasource.username", clickhouseContainer::getUsername);
registry.add("spring.datasource.password", clickhouseContainer::getPassword);
registry.add("spring.datasource.driver-class-name", clickhouseContainer::getDriverClassName);
};
}
}`
我們在建立ClickHouseContainer bean 時指定 ClickHouse 映像的最新穩定版本。
然後,我們定義一個DynamicPropertyRegistrar bean 來配置必要的資料來源屬性。這允許我們的應用程式連接到 ClickHouse 資料庫容器。
配置正確的連接詳細資訊後,Spring Boot 會自動建立一個JdbcTemplate bean,我們將在本教學後面使用它。
3.3.在開發過程中使用測試容器
雖然 Testcontainers 主要用於整合測試,但我們也可以在本地開發期間使用它。
為了實現這一點,我們將在src/test/java目錄中建立一個單獨的主類別:
class TestApplication {
public static void main(String[] args) {
SpringApplication.from(Application::main)
.with(TestcontainersConfiguration.class)
.run(args);
}
}
我們建立一個TestApplication類,並在其main()方法中,使用TestcontainersConfiguration類別啟動我們的主Application類別。
此設定可幫助我們在本地設定和管理外部服務。我們可以執行 Spring Boot 應用程式並將其連接到透過 Testcontainers 啟動的外部服務。
4. 執行CRUD操作
現在我們已經設定了本地環境,讓我們authors **JdbcTemplate** bean與authors表進行互動:
Author author = Author.create("John Doe", "[email protected]");
jdbcTemplate.update(
"""
INSERT INTO authors (id, name, email, created_at)
VALUES (?, ?, ?, ?);
""",
author.id(),
author.name(),
author.email(),
author.createdAt()
);
這裡,我們使用create()方法建立一個新的Author實例,然後使用JdbcTemplate的update()方法將其插入到authors表中。
要驗證author記錄是否已成功保留,讓我們使用其id執行讀取查詢:
List<Author> retrievedAuthors = jdbcTemplate.query(
"SELECT * FROM authors WHERE id = ?",
(ResultSet resultSet, int rowNum) -> new Author(
UUID.fromString(resultSet.getString("id")),
resultSet.getString("name"),
resultSet.getString("email"),
resultSet.getObject("created_at", LocalDateTime.class)
),
author.id()
);
assertThat(retrievedAuthors)
.hasSize(1)
.first()
.satisfies(retrievedAuthor -> {
assertThat(retrievedAuthor.id()).isEqualTo(author.id());
assertThat(retrievedAuthor.name()).isEqualTo(author.name());
assertThat(retrievedAuthor.email()).isEqualTo(author.email());
assertThat(retrievedAuthor.createdAt()).isNotNull();
});
我們使用JdbcTemplate的query()方法透過id檢索已儲存的author記錄,並斷言檢索到的作者與我們先前儲存的作者相符。
為了演示,我們只執行保存和讀取操作。但是,可以使用 ClickHouse 的SQL 參考來了解有關其語法和運算符的更多資訊。
5. 結論
在本文中,我們探索了將 ClickHouse 資料庫整合到我們的 Spring Boot 應用程式中。
我們使用 Flyway 遷移腳本在資料庫中建立了一個authors表。然後,使用 Testcontainers,我們為 ClickHouse 資料庫啟動了一個臨時 Docker 容器,創建了一個本地測試環境。
最後,我們使用JdbcTemplate對authors表進行儲存和讀取操作。
與往常一樣,本文中使用的所有程式碼範例都可以在 GitHub 上找到。