Commit b36b12b2 authored by Russ Cox's avatar Russ Cox

database/sql/driver: explain Driver vs DriverContext vs Connector

The docs make it seem like they are all things a single object
would implement. That's true of Driver and DriverContext,
but Connector is really something else. Attempt to clarify.

Change-Id: I8fdf1cff855a0fbe37ea22720c082045c719a267
Reviewed-on: https://go-review.googlesource.com/82082
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDaniel Theophanes <kardianos@gmail.com>
parent ef544b64
...@@ -42,6 +42,10 @@ type NamedValue struct { ...@@ -42,6 +42,10 @@ type NamedValue struct {
// Driver is the interface that must be implemented by a database // Driver is the interface that must be implemented by a database
// driver. // driver.
//
// Database drivers may implement DriverContext for access
// to contexts and to parse the name only once for a pool of connections,
// instead of once per connection.
type Driver interface { type Driver interface {
// Open returns a new connection to the database. // Open returns a new connection to the database.
// The name is a string in a driver-specific format. // The name is a string in a driver-specific format.
...@@ -55,20 +59,27 @@ type Driver interface { ...@@ -55,20 +59,27 @@ type Driver interface {
Open(name string) (Conn, error) Open(name string) (Conn, error)
} }
// DriverContext enhances the Driver interface by returning a Connector // If a Driver implements DriverContext, then sql.DB will call
// rather then a single Conn. // OpenConnector to obtain a Connector and then invoke
// It separates out the name parsing step from actually connecting to the // that Connector's Conn method to obtain each needed connection,
// database. It also gives dialers access to the context by using the // instead of invoking the Driver's Open method for each connection.
// Connector. // The two-step sequence allows drivers to parse the name just once
// and also provides access to per-Conn contexts.
type DriverContext interface { type DriverContext interface {
// OpenConnector must parse the name in the same format that Driver.Open // OpenConnector must parse the name in the same format that Driver.Open
// parses the name parameter. // parses the name parameter.
OpenConnector(name string) (Connector, error) OpenConnector(name string) (Connector, error)
} }
// Connector is an optional interface that drivers can implement. // A Connector represents a driver in a fixed configuration
// It allows drivers to provide more flexible methods to open // and can create any number of equivalent Conns for use
// database connections without requiring the use of a DSN string. // by multiple goroutines.
//
// A Connector can be passed to sql.OpenDB, to allow drivers
// to implement their own sql.DB constructors, or returned by
// DriverContext's OpenConnector method, to allow drivers
// access to context and to avoid repeated parsing of driver
// configuration.
type Connector interface { type Connector interface {
// Connect returns a connection to the database. // Connect returns a connection to the database.
// Connect may return a cached connection (one previously // Connect may return a cached connection (one previously
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment