diff --git a/internal/pool/pool.go b/internal/pool/pool.go
index 2125f3e13..d60edc4b0 100644
--- a/internal/pool/pool.go
+++ b/internal/pool/pool.go
@@ -68,6 +68,7 @@ type Options struct {
 	MaxActiveConns  int
 	ConnMaxIdleTime time.Duration
 	ConnMaxLifetime time.Duration
+	ConnChecker     func(net.Conn) error
 }
 
 type lastDialErrorWrap struct {
@@ -513,6 +514,12 @@ func (p *ConnPool) isHealthyConn(cn *Conn) bool {
 		return false
 	}
 
+	if p.cfg.ConnChecker != nil {
+		if err := p.cfg.ConnChecker(cn.netConn); err != nil {
+			return false
+		}
+	}
+
 	cn.SetUsedAt(now)
 	return true
 }
diff --git a/options.go b/options.go
index 6ed693a0b..01205bec1 100644
--- a/options.go
+++ b/options.go
@@ -139,6 +139,9 @@ type Options struct {
 	// Default is to not close idle connections.
 	ConnMaxLifetime time.Duration
 
+	// ConnChecker checks the health of a connection before returning it to the client.
+	ConnChecker func(net.Conn) error
+
 	// TLS Config to use. When set, TLS will be negotiated.
 	TLSConfig *tls.Config
 
@@ -520,5 +523,6 @@ func newConnPool(
 		MaxActiveConns:  opt.MaxActiveConns,
 		ConnMaxIdleTime: opt.ConnMaxIdleTime,
 		ConnMaxLifetime: opt.ConnMaxLifetime,
+		ConnChecker:     opt.ConnChecker,
 	})
 }