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 上找到。