@ -1,23 +1,25 @@
package com.dsideal.Res.Plugin ;
import io.milvus.pool.MilvusClientV2Pool ;
import io.milvus.pool.PoolConfig ;
import io.milvus.v2.client.ConnectConfig ;
import io.milvus.v2.client.MilvusClientV2 ;
import lombok.Getter ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import io.milvus.pool.MilvusClientV2Pool ; // Milvus V2版本连接池类
import io.milvus.pool.PoolConfig ; // 连接池配置类
import io.milvus.v2.client.ConnectConfig ; // 连接配置类
import io.milvus.v2.client.MilvusClientV2 ; // Milvus客户端接口
import lombok.Getter ; // Lombok注解, 自动生成getter方法
import org.slf4j.Logger ; // 日志接口
import org.slf4j.LoggerFactory ; // 日志工厂
import java.time.Duration ; // 时间间隔类
import java.time.Duration ;
@Getter
@Getter // 自动为所有字段生成getter方法
public class MilvusPlugin {
private static MilvusPlugin instance ;
private static final Logger logger = LoggerFactory . getLogger ( MilvusPlugin . class ) ;
private MilvusClientV2Pool pool ;
private static MilvusPlugin instance ; // 单例实例
private static final Logger logger = LoggerFactory . getLogger ( MilvusPlugin . class ) ; // 日志记录器
private MilvusClientV2Pool pool ; // Milvus连接池实例
// 私有构造方法,确保单例模式
private MilvusPlugin ( ) {
}
// 获取单例实例
public static MilvusPlugin getInstance ( ) {
if ( instance = = null ) {
instance = new MilvusPlugin ( ) ;
@ -25,19 +27,24 @@ public class MilvusPlugin {
return instance ;
}
// 初始化连接池
public void init ( String host , int port , int maxConnections ) {
try {
// 构建连接配置
ConnectConfig connectConfig = ConnectConfig . builder ( )
. uri ( "http://" + host + ":" + port )
. uri ( "http://" + host + ":" + port ) // 设置Milvus服务地址
. build ( ) ;
// 构建连接池配置
PoolConfig poolConfig = PoolConfig . builder ( )
. maxIdlePerKey ( 10 ) // max idle clients per key
. maxTotalPerKey ( 20 ) // max total(idle + active) clients per key
. maxTotal ( 100 ) // max total clients for all keys
. maxBlockWaitDuration ( Duration . ofSeconds ( 5L ) ) // getClient() will wait 5 seconds if no idle client available
. minEvictableIdleDuration ( Duration . ofSeconds ( 10L ) ) // if number of idle clients is larger than maxIdlePerKey, redundant idle clients will be evicted after 10 seconds
. maxIdlePerKey ( 10 ) // 每个key最大空闲连接数
. maxTotalPerKey ( 20 ) // 每个key最大总连接数(活跃+空闲)
. maxTotal ( 100 ) // 所有key的总连接数上限
. maxBlockWaitDuration ( Duration . ofSeconds ( 5L ) ) // 获取连接时最大等待时间
. minEvictableIdleDuration ( Duration . ofSeconds ( 10L ) ) // 空闲连接最小可回收时间
. build ( ) ;
// 创建连接池实例
pool = new MilvusClientV2Pool ( poolConfig , connectConfig ) ;
logger . info ( "Milvus连接池初始化成功, 最大连接数: {}" , maxConnections ) ;
} catch ( Exception e ) {
@ -46,24 +53,27 @@ public class MilvusPlugin {
}
}
// 从连接池获取客户端连接
public MilvusClientV2 getClient ( ) {
try {
return pool . getClient ( "client_name" ) ;
return pool . getClient ( "client_name" ) ; // 使用固定key获取连接
} catch ( Exception e ) {
logger . error ( "获取Milvus连接失败: " + e . getMessage ( ) , e ) ;
throw new RuntimeException ( "获取Milvus连接失败" , e ) ;
}
}
// 归还客户端连接到连接池
public void returnClient ( MilvusClientV2 client ) {
if ( client ! = null ) {
pool . returnClient ( "client_name" , client ) ;
pool . returnClient ( "client_name" , client ) ; // 使用固定key归还连接
}
}
// 关闭连接池
public void close ( ) {
if ( pool ! = null ) {
pool . close ( ) ;
pool . close ( ) ; // 释放所有连接资源
}
}
}
}