Skip to content

Commit

Permalink
Add ?_cache_size=[..] to connection parameters (#894)
Browse files Browse the repository at this point in the history
Add a shortcut for PRAGMA cache_size; this is a pretty useful setting:
the default of -2000 (2M) is not especially high, and a lot of people
will probably want to increase this.

For example, while running a bunch of fairy expensive queries in
parallel:

	With SetMaxOpenConns(1):
	 -2000:  5762ms
	-20000:  4714ms

	With SetMaxOpenConns(20):
	 -2000:  3067ms
	-20000:  2532ms

Which isn't a bad performance boost for changing a single number.
  • Loading branch information
arp242 committed Dec 26, 2020
1 parent e30206c commit 02ce7ec
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -125,6 +125,8 @@ Boolean values can be one of:
| Time Zone Location | `_loc` | auto | Specify location of time format. |
| Transaction Lock | `_txlock` | <ul><li>immediate</li><li>deferred</li><li>exclusive</li></ul> | Specify locking behavior for transactions. |
| Writable Schema | `_writable_schema` | `Boolean` | When this pragma is on, the SQLITE_MASTER tables in which database can be changed using ordinary UPDATE, INSERT, and DELETE statements. Warning: misuse of this pragma can easily result in a corrupt database file. |
| Cache Size | `_cache_size` | `int` | Maximum cache size; default is 2000K (2M). See [PRAGMA cache_size](https://sqlite.org/pragma.html#pragma_cache_size) |


## DSN Examples

Expand Down
21 changes: 21 additions & 0 deletions sqlite3.go
Expand Up @@ -1040,6 +1040,7 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
synchronousMode := "NORMAL"
writableSchema := -1
vfsName := ""
var cacheSize *int64

pos := strings.IndexRune(dsn, '?')
if pos >= 1 {
Expand Down Expand Up @@ -1363,6 +1364,18 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
}
}

// Cache size (_cache_size)
//
// https://sqlite.org/pragma.html#pragma_cache_size
//
if val := params.Get("_cache_size"); val != "" {
iv, err := strconv.ParseInt(val, 10, 64)
if err != nil {
return nil, fmt.Errorf("Invalid _cache_size: %v: %v", val, err)
}
cacheSize = &iv
}

if val := params.Get("vfs"); val != "" {
vfsName = val
}
Expand Down Expand Up @@ -1675,6 +1688,14 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
}
}

// Cache Size
if cacheSize != nil {
if err := exec(fmt.Sprintf("PRAGMA cache_size = %d;", *cacheSize)); err != nil {
C.sqlite3_close_v2(db)
return nil, err
}
}

if len(d.Extensions) > 0 {
if err := conn.loadExtensions(d.Extensions); err != nil {
conn.Close()
Expand Down

0 comments on commit 02ce7ec

Please sign in to comment.