func (d *boltDriverPool) OpenPool() (Conn, error) {
	d.refLock.Lock()
	defer d.refLock.Unlock()
	if !d.closed {
		conn := <-d.pool
		if connectionNilOrClosed(conn) {
			if err := conn.initialize(); err != nil {
				return nil, err
			}
			d.connRefs = append(d.connRefs, conn)
		}
		return conn, nil
	}
	return nil, errors.New("Driver pool has been closed")
}
OpenPool opens a returns a Bolt connection from the pool to the Neo4J database.
package golangNeo4jBoltDriver
import (
	"github.com/johnnadratowski/golang-neo4j-bolt-driver/log"
	"time"
	"database/sql"
	"database/sql/driver"
	"github.com/johnnadratowski/golang-neo4j-bolt-driver/errors"
	"sync"
)
var (
	magicPreamble     = []byte{0x60, 0x60, 0xb0, 0x17}
	supportedVersions = []byte{
		0x00, 0x00, 0x00, 0x01,
		0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00,
	}
	handShake          = append(magicPreamble, supportedVersions...)
	noVersionSupported = []byte{0x00, 0x00, 0x00, 0x00}
	Version = "1.0"
	ClientID = "GolangNeo4jBolt/" + Version
)
type Driver interface {
	Open(string) (driver.Conn, error)
	OpenNeo(string) (Conn, error)
}
type boltDriver struct {
	recorder *recorder
}
func NewDriver() Driver {
	return &boltDriver{}
}
func (d *boltDriver) Open(connStr string) (driver.Conn, error) {
	return newBoltConn(connStr, d)  
}
func (d *boltDriver) OpenNeo(connStr string) (Conn, error) {
	return newBoltConn(connStr, d)
}
type DriverPool interface {
	OpenPool() (Conn, error)
	reclaim(*boltConn) error
}
type ClosableDriverPool interface {
	DriverPool
	Close() error
}
type boltDriverPool struct {
	connStr  string
	maxConns int
	pool     chan *boltConn
	connRefs []*boltConn
	refLock  sync.Mutex
	closed   bool
}
func NewDriverPool(connStr string, max int) (DriverPool, error) {
	return createDriverPool(connStr, max)
}
func NewClosableDriverPool(connStr string, max int) (ClosableDriverPool, error) {
	return createDriverPool(connStr, max)
}
func createDriverPool(connStr string, max int) (*boltDriverPool, error) {
	d := &boltDriverPool{
		connStr:  connStr,
		maxConns: max,
		pool:     make(chan *boltConn, max),
	}
	for i := 0; i < max; i++ {
		conn, err := newPooledBoltConn(connStr, d)
		if err != nil {
			return nil, err
		}
		d.pool <- conn
	}
	return d, nil
}