diff --git a/client/option.go b/client/option.go
index 8f555685e4..71181537e2 100644
--- a/client/option.go
+++ b/client/option.go
@@ -33,7 +33,6 @@ import (
 	"github.com/cloudwego/kitex/pkg/loadbalance"
 	"github.com/cloudwego/kitex/pkg/loadbalance/lbcache"
 	"github.com/cloudwego/kitex/pkg/remote"
-	connpool2 "github.com/cloudwego/kitex/pkg/remote/connpool"
 	"github.com/cloudwego/kitex/pkg/remote/trans/netpollmux"
 	"github.com/cloudwego/kitex/pkg/remote/trans/nphttp2"
 	"github.com/cloudwego/kitex/pkg/retry"
@@ -186,7 +185,7 @@ func WithShortConnection() Option {
 	return Option{F: func(o *client.Options, di *utils.Slice) {
 		di.Push("WithShortConnection")
 
-		o.RemoteOpt.ConnPool = connpool2.NewShortPool(o.Svr.ServiceName)
+		o.PoolCfg = new(connpool.IdleConfig)
 	}}
 }
 
@@ -196,7 +195,6 @@ func WithLongConnection(cfg connpool.IdleConfig) Option {
 		di.Push(fmt.Sprintf("WithLongConnection(%+v)", cfg))
 
 		o.PoolCfg = connpool.CheckPoolConfig(cfg)
-		o.RemoteOpt.ConnPool = connpool2.NewLongPool(o.Svr.ServiceName, *o.PoolCfg)
 	}}
 }
 
diff --git a/client/option_advanced.go b/client/option_advanced.go
index 5e3100a78b..260d306cc7 100644
--- a/client/option_advanced.go
+++ b/client/option_advanced.go
@@ -26,6 +26,7 @@ import (
 	"github.com/cloudwego/kitex/pkg/acl"
 	"github.com/cloudwego/kitex/pkg/diagnosis"
 	"github.com/cloudwego/kitex/pkg/generic"
+	"github.com/cloudwego/kitex/pkg/klog"
 	"github.com/cloudwego/kitex/pkg/proxy"
 	"github.com/cloudwego/kitex/pkg/remote"
 	"github.com/cloudwego/kitex/pkg/remote/trans/netpoll"
@@ -133,12 +134,19 @@ func WithDialer(d remote.Dialer) Option {
 	}}
 }
 
-// WithConnPool to set connection pool
+// WithConnPool sets the connection pool.
+// Note that this option can only be specified once. If more
+// than one pool is specified by this option, only the first
+// one will be used.
 func WithConnPool(pool remote.ConnPool) Option {
 	return Option{F: func(o *client.Options, di *utils.Slice) {
 		di.Push(fmt.Sprintf("WithConnPool((%T)", pool))
 
-		o.RemoteOpt.ConnPool = pool
+		if o.RemoteOpt.ConnPool == nil {
+			o.RemoteOpt.ConnPool = pool
+		} else {
+			klog.Warnf("The connection pool has been initialized. The call to WithConnPool will not take effect.")
+		}
 	}}
 }
 
diff --git a/internal/client/option.go b/internal/client/option.go
index 1236f3b414..76dbf2b39d 100644
--- a/internal/client/option.go
+++ b/internal/client/option.go
@@ -145,8 +145,16 @@ func NewOptions(opts []Option) *Options {
 
 func (o *Options) initConnectionPool() {
 	if o.RemoteOpt.ConnPool == nil {
-		o.RemoteOpt.ConnPool = connpool.NewLongPool(o.Svr.ServiceName,
-			connpool2.IdleConfig{MaxIdlePerAddress: 10, MaxIdleGlobal: 100, MaxIdleTimeout: time.Minute})
+		if o.PoolCfg != nil {
+			var zero connpool2.IdleConfig
+			if *o.PoolCfg == zero {
+				o.RemoteOpt.ConnPool = connpool.NewShortPool(o.Svr.ServiceName)
+			} else {
+				o.RemoteOpt.ConnPool = connpool.NewLongPool(o.Svr.ServiceName, *o.PoolCfg)
+			}
+		} else {
+			o.RemoteOpt.ConnPool = connpool.NewLongPool(o.Svr.ServiceName, connpool2.IdleConfig{MaxIdlePerAddress: 10, MaxIdleGlobal: 100, MaxIdleTimeout: time.Minute})
+		}
 	}
 	pool := o.RemoteOpt.ConnPool
 	o.CloseCallbacks = append(o.CloseCallbacks, pool.Close)
diff --git a/pkg/connpool/config.go b/pkg/connpool/config.go
index 2f710f8f1c..66cbfbc98c 100644
--- a/pkg/connpool/config.go
+++ b/pkg/connpool/config.go
@@ -38,5 +38,13 @@ func CheckPoolConfig(config IdleConfig) *IdleConfig {
 	} else if config.MaxIdleTimeout < 3*time.Second {
 		config.MaxIdleTimeout = minMaxIdleTimeout
 	}
+
+	if config.MaxIdlePerAddress <= 0 {
+		config.MaxIdlePerAddress = 1
+	}
+
+	if config.MaxIdleGlobal <= 0 {
+		config.MaxIdleGlobal = 1
+	}
 	return &config
 }
diff --git a/version.go b/version.go
index 1b180fe805..9a36adb5a0 100644
--- a/version.go
+++ b/version.go
@@ -19,5 +19,5 @@ package kitex
 // Name and Version info of this framework, used for statistics and debug
 const (
 	Name    = "Kitex"
-	Version = "v0.0.2"
+	Version = "v0.0.3"
 )