这段内容详细介绍了 Apache Ignite 的 JDBC Client Driver(JDBC 客户端驱动),以及如何使用它来连接和操作 Ignite 集群。我们可以从几个维度来逐步理解这段内容:
🧩 一、JDBC Client Driver 是什么?
JDBC Client Driver 是 Apache Ignite 提供的 JDBC 驱动程序,用于通过标准的 JDBC API 与 Ignite 集群交互。
- 它通过 一个客户端节点(client node) 连接到集群。
- 与集群的交互包括:
- 执行 SQL 查询
- 插入、更新、删除数据
- 数据流式加载(streaming 模式)
📦 二、使用前的准备工作
1. 依赖配置
你需要将以下 JAR 包加入项目或工具的 classpath:
- 所有
{IGNITE_HOME}/libs
目录下的 JAR 文件 {IGNITE_HOME}/ignite-indexing
和{IGNITE_HOME}/ignite-spring
目录下的 JAR 文件
2. 配置文件
你必须提供一个 Spring XML 配置文件,用于定义客户端节点如何连接到 Ignite 集群。
- 例如:
ignite-jdbc.xml
文件中可能包含集群地址、端口、安全配置等。
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Ignite configuration bean -->
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<!-- Set to true to enable client mode for the node -->
<property name="clientMode" value="true"/>
<!-- Setting up discovery mechanism, here using multicast for simplicity -->
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<!-- Multicast IP finder example -->
<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
<property name="addresses">
<list>
<!-- Replace with your cluster nodes addresses -->
<value>192.168.1.100:47500..47509</value>
<!-- Add more addresses as needed -->
</list>
</property>
</bean>
</property>
</bean>
</property>
<!-- Optional: Enable indexing for SQL queries -->
<property name="cacheConfiguration">
<list>
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="default"/>
<property name="sqlSchema" value="PUBLIC"/>
</bean>
</list>
</property>
<!-- Additional configurations can be added here -->
</bean>
</beans>
📡 三、JDBC 连接字符串格式
JDBC URL 的格式如下:
jdbc:ignite:cfg://[<params>@]<config_url>
各部分说明:
参数 | 说明 |
---|---|
<config_url> |
必填,指向 Spring XML 配置文件的 URL(可以是本地文件路径或远程 URL) |
<params> |
可选,多个参数用 : 分隔,如:streaming=true:schema=MYSCHEMA |
示例:
java
// 连接到默认缓存
Connection conn = DriverManager.getConnection("jdbc:ignite:cfg://file:///etc/config/ignite-jdbc.xml");
// 使用 streaming 模式
Connection conn = DriverManager.getConnection("jdbc:ignite:cfg://streaming=true@file:///etc/config/ignite-jdbc.xml");
🧠 四、JDBC 驱动特点
特性 | 说明 |
---|---|
基于客户端节点连接 | 实际是启动了一个轻量级客户端节点与集群通信 |
支持跨缓存查询(Cross-Cache Queries) | 可以同时访问多个缓存(相当于多个表) |
不总是支持最新 SQL 特性 | 因为是"更稳定的"驱动,可能不包含最新的 SQL 功能 |
支持数据流式写入(Streaming Mode) | 可以批量插入数据到缓存中,效率高 |
支持标准 JDBC 操作 | SELECT、INSERT、UPDATE、DELETE、MERGE 等 |
📥 五、Streaming Mode(流式写入模式)
用于 批量插入数据 到缓存中,适用于数据预加载、快速导入等场景。
如何启用 Streaming Mode:
在连接字符串中添加 streaming=true
:
java
Connection conn = DriverManager.getConnection(
"jdbc:ignite:cfg://streaming=true@file:///etc/config/ignite-jdbc.xml"
);
注意事项:
- 必须指定缓存名 :
cache=myCache
- 只支持 INSERT 操作
- 可配置参数 (影响流式性能):
streamingPerNodeBufferSize
:缓冲区大小streamingFlushFrequency
:刷新频率(毫秒)
示例代码:
java
Connection conn = DriverManager.getConnection(
"jdbc:ignite:cfg://streaming=true:streamingFlushFrequency=1000@file:///etc/config/ignite-jdbc.xml"
);
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO Person(_key, name, age) VALUES(CAST(? as BIGINT), ?, ?)"
);
for (int i = 1; i < 100000; i++) {
stmt.setInt(1, i);
stmt.setString(2, "John Smith");
stmt.setInt(3, 25);
stmt.execute();
}
conn.close(); // 所有数据会在此时刷新到缓存中
📝 六、标准 SQL 操作示例
1. 查询数据(SELECT)
java
ResultSet rs = conn.createStatement().executeQuery("SELECT name FROM Person");
while (rs.next()) {
String name = rs.getString(1);
}
2. 带参数的查询(Prepared Statement)
java
PreparedStatement stmt = conn.prepareStatement("SELECT name, age FROM Person WHERE age = ?");
stmt.setInt(1, 30);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
}
3. 插入数据(INSERT)
java
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO Person(_key, name, age) VALUES(CAST(? as BIGINT), ?, ?)"
);
stmt.setInt(1, 1);
stmt.setString(2, "John Smith");
stmt.setInt(3, 25);
stmt.execute();
4. 合并数据(MERGE)
java
PreparedStatement stmt = conn.prepareStatement(
"MERGE INTO Person(_key, name, age) VALUES(CAST(? as BIGINT), ?, ?)"
);
stmt.setInt(1, 1);
stmt.setString(2, "John Smith");
stmt.setInt(3, 25);
stmt.executeUpdate();
5. 更新数据(UPDATE)
java
conn.createStatement().executeUpdate("UPDATE Person SET age = age + 1 WHERE age = 25");
6. 删除数据(DELETE)
java
conn.createStatement().execute("DELETE FROM Person WHERE age = 25");
🔐 七、安全性
- 你可以通过 Ignite 的 Security 文档 来配置安全连接。
- 支持 SSL、认证、权限控制等机制。
📌 八、总结
内容 | 说明 |
---|---|
驱动类名 | org.apache.ignite.IgniteJdbcDriver |
连接方式 | 基于客户端节点连接 |
支持操作 | SELECT、INSERT、UPDATE、DELETE、MERGE、Streaming 模式 |
配置文件 | 必须提供 Spring XML 配置文件 |
流式写入 | 支持批量插入,适合数据预加载 |
SQL 支持 | 支持 ANSI SQL,但可能不包含最新 SQL 特性 |
Schema 支持 | 可以通过参数或连接串指定默认 schema |
多缓存查询 | 支持跨缓存查询(Cross-Cache Queries) |