跳到主要内容

执行命令

通过 JDBC 执行命令

下面的独立示例创建 books_demo 集合及索引,写入一条记录后执行搜索。在已有数据库运行时请使用新的集合名。

import java.sql.*;
import java.util.Properties;

public class MilvusJdbcExample {
public static void main(String[] args) throws Exception {
String url = args.length == 0
? "jdbc:dbvisitor:milvus://127.0.0.1:19530/default"
: args[0];
Properties props = new Properties();
props.setProperty("consistencyLevel", "Strong");
props.setProperty("connectTimeout", "10000");
props.setProperty("maxRetry", "3");
// If authentication is enabled:
// props.setProperty("token", "YOUR_TOKEN");

Class.forName("net.hasor.dbvisitor.driver.JdbcDriver");
try (Connection conn = DriverManager.getConnection(url, props)) {
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("CREATE TABLE books_demo (" +
"book_id INT64 PRIMARY KEY, title VARCHAR(200), " +
"word_count INT32 DEFAULT 0, book_intro FLOAT_VECTOR(2))");
stmt.executeUpdate("CREATE INDEX idx_intro ON books_demo (book_intro) " +
"USING 'FLAT' WITH (metric_type='L2')");
stmt.executeUpdate("LOAD TABLE books_demo");
}

String insert = "INSERT INTO books_demo " +
"(book_id, title, word_count, book_intro) VALUES (?, ?, ?, ?)";
try (PreparedStatement ps = conn.prepareStatement(insert)) {
ps.setLong(1, 1L);
ps.setString(2, "A book");
ps.setInt(3, 1000);
ps.setObject(4, new float[] {0.1F, 0.2F});
System.out.println("inserted=" + ps.executeUpdate());
}

String search = "SELECT book_id, title, score FROM books_demo " +
"WHERE word_count >= ? ORDER BY book_intro <-> ? LIMIT ?";
try (PreparedStatement ps = conn.prepareStatement(search)) {
ps.setInt(1, 100);
ps.setObject(2, new float[] {0.1F, 0.2F});
ps.setInt(3, 5);
ps.setFetchSize(128);
ps.setQueryTimeout(30);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.printf("%d %s %.4f%n", rs.getLong("book_id"),
rs.getString("title"), rs.getFloat("score"));
}
}
}
}
}
}

控制分页写入

下面片段使用已打开的连接 conn。fetchSize 控制内部每页记录数,LIMIT 控制本次选取的总量;执行失败不会回滚先前成功的页面。

try (PreparedStatement ps = conn.prepareStatement(
"UPSERT INTO books_demo (book_id, title, word_count, book_intro) VALUES (?, ?, ?, ?)")) {
ps.setLong(1, 1L);
ps.setString(2, "Revised book");
ps.setInt(3, 1200);
ps.setObject(4, new double[] {0.1, 0.2});
ps.executeUpdate();
}
try (PreparedStatement ps = conn.prepareStatement(
"UPDATE books_demo SET word_count = ? WHERE book_id = ? LIMIT ?")) {
ps.setInt(1, 1500);
ps.setLong(2, 1L);
ps.setInt(3, 1);
ps.setFetchSize(128);
System.out.println(ps.executeLargeUpdate());
}
try (PreparedStatement ps = conn.prepareStatement(
"DELETE FROM books_demo WHERE book_id = ? LIMIT ?")) {
ps.setLong(1, 1L);
ps.setInt(2, 1);
System.out.println(ps.executeLargeUpdate());
}
try (PreparedStatement ps = conn.prepareStatement(
"SELECT book_id, title FROM books_demo WHERE word_count >= ?")) {
ps.setInt(1, 100);
ps.setFetchSize(256);
ps.setMaxRows(1000);
ps.setQueryTimeout(30);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getLong("book_id") + ": " + rs.getString("title"));
}
}
}

执行控制

  • setFetchSize(rows):单页记录数,不是总量上限。
  • setQueryTimeout(seconds):执行时间预算,包含重试和后续结果取页,单位秒。
  • 连接与单次 RPC 超时见参数配置;命令同步等待时间见 Hint 支持
写后立即读取

SDK 2.6.22 的 QueryIterator 使用集合默认一致性。分页查询或 DML 选取数据需要写后立即可见时,建表应设置 WITH (consistency_level=Strong);仅配置连接参数 consistencyLevel=Strong 不够。

可绑定的参数类型见参数绑定