ZBLOG

golang milvus 连接池

Milvus是一个开源的向量数据库,支持高维向量相似度搜索。在使用Milvus时,可以使用连接池来管理连接,提高性能和效率。

在Go语言中,可以使用第三方库如go-redis或者自己实现连接池来管理Milvus的连接。下面给出一个自己实现的简单的Milvus连接池示例:

  1. package milvus
  2. import (
  3. "errors"
  4. "github.com/milvus-io/milvus-sdk-go/milvus"
  5. "sync"
  6. )
  7. type Pool struct {
  8. mu sync.Mutex
  9. connections chan *milvus.MilvusClient
  10. factory func() (*milvus.MilvusClient, error)
  11. size int
  12. closed bool
  13. }
  14. func NewPool(factory func() (*milvus.MilvusClient, error), size int) (*Pool, error) {
  15. if size <= 0 {
  16. return nil, errors.New("invalid pool size")
  17. }
  18. p := &Pool{
  19. connections: make(chan *milvus.MilvusClient, size),
  20. factory: factory,
  21. size: size,
  22. }
  23. for i := 0; i < size; i++ {
  24. conn, err := p.factory()
  25. if err != nil {
  26. p.Close()
  27. return nil, err
  28. }
  29. p.connections <- conn
  30. }
  31. return p, nil
  32. }
  33. func (p *Pool) Get() (*milvus.MilvusClient, error) {
  34. p.mu.Lock()
  35. defer p.mu.Unlock()
  36. if p.closed {
  37. return nil, errors.New("pool is closed")
  38. }
  39. select {
  40. case conn := <-p.connections:
  41. return conn, nil
  42. default:
  43. conn, err := p.factory()
  44. if err != nil {
  45. return nil, err
  46. }
  47. return conn, nil
  48. }
  49. }
  50. func (p *Pool) Put(conn *milvus.MilvusClient) error {
  51. p.mu.Lock()
  52. defer p.mu.Unlock()
  53. if p.closed {
  54. return conn.Close()
  55. }
  56. select {
  57. case p.connections <- conn:
  58. return nil
  59. default:
  60. return conn.Close()
  61. }
  62. }
  63. func (p *Pool) Close() {
  64. p.mu.Lock()
  65. defer p.mu.Unlock()
  66. if p.closed {
  67. return
  68. }
  69. p.closed = true
  70. close(p.connections)
  71. for conn := range p.connections {
  72. conn.Close()
  73. }
  74. }

使用示例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/milvus-io/milvus-sdk-go/milvus"
  5. "sync"
  6. )
  7. func main() {
  8. pool, err := milvus.NewPool(func() (*milvus.MilvusClient, error) {
  9. // 连接Milvus服务端
  10. client, err := milvus.NewMilvusClient(milvus.WithAddress("localhost:19530"))
  11. if err != nil {
  12. return nil, err
  13. }
  14. // 登录授权
  15. err = client.Connect(&milvus.ConnectParam{AppID: "test"})
  16. if err != nil {
  17. return nil, err
  18. }
  19. return client, nil
  20. }, 5)
  21. if err != nil {
  22. panic(err)
  23. }
  24. defer pool.Close()
  25. var wg sync.WaitGroup
  26. for i := 0; i < 10; i++ {
  27. wg.Add(1)
  28. go func() {
  29. defer wg.Done()
  30. conn, err := pool.Get()
  31. if err != nil {
  32. panic(err)
  33. }
  34. defer pool.Put(conn)
  35. // 使用连接进行操作
  36. res, err := conn.HasCollection(&milvus.HasCollectionParam{CollectionName: "test"})
  37. if err != nil {
  38. panic(err)
  39. }
  40. fmt.Println(res)
  41. }()
  42. }
  43. wg.Wait()
  44. }

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=388

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?