Skip to content

Commit 2272f4c

Browse files
Merge pull request #12 from depot/global-connection
2 parents c93a194 + 9a837ae commit 2272f4c

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

Diff for: README.md

+18
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ function inflate(field, value) {
102102
}
103103
```
104104

105+
#### Experimental: `useSharedConnection`
106+
107+
As of version 1.3.0, `PlanetScaleDialect` supports using a shared `@planetscale/database` connection for all non-transaction queries, to improve query performance. This option is not enabled by default, but can be enabled by setting the `useSharedConnection` option to `true`. Transaction queries will always run using their own connection.
108+
109+
This is an experimental feature, and may be removed in a future version.
110+
111+
```typescript
112+
import {Kysely} from 'kysely'
113+
import {PlanetScaleDialect} from 'kysely-planetscale'
114+
115+
const db = new Kysely<Database>({
116+
dialect: new PlanetScaleDialect({
117+
url: process.env.DATABASE_URL,
118+
useSharedConnection: true,
119+
}),
120+
})
121+
```
122+
105123
## License
106124

107125
MIT License, see `LICENSE`.

Diff for: src/index.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ import {
2020
*
2121
* @see https://github.com/planetscale/database-js#usage
2222
*/
23-
export interface PlanetScaleDialectConfig extends Config {}
23+
export interface PlanetScaleDialectConfig extends Config {
24+
/**
25+
* Use a single `@planetscale/database` connection for all non-transaction queries.
26+
*
27+
* @default false
28+
*/
29+
useSharedConnection?: boolean
30+
}
2431

2532
/**
2633
* PlanetScale dialect that uses the [PlanetScale Serverless Driver for JavaScript][0].
@@ -99,14 +106,19 @@ class PlanetScaleDriver implements Driver {
99106
async destroy(): Promise<void> {}
100107
}
101108

109+
const sharedConnections = new WeakMap<PlanetScaleDialectConfig, Connection>()
110+
102111
class PlanetScaleConnection implements DatabaseConnection {
103112
#config: PlanetScaleDialectConfig
104113
#conn: Connection
105114
#transactionClient?: PlanetScaleConnection
106115

107-
constructor(config: PlanetScaleDialectConfig) {
116+
constructor(config: PlanetScaleDialectConfig, isForTransaction = false) {
108117
this.#config = config
109-
this.#conn = connect({cast: inflateDates, ...config})
118+
const useSharedConnection = config.useSharedConnection && !isForTransaction
119+
const sharedConnection = useSharedConnection ? sharedConnections.get(config) : undefined
120+
this.#conn = sharedConnection ?? connect({cast: inflateDates, ...config})
121+
if (useSharedConnection) sharedConnections.set(config, this.#conn)
110122
}
111123

112124
async executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {
@@ -138,7 +150,7 @@ class PlanetScaleConnection implements DatabaseConnection {
138150
}
139151

140152
async beginTransaction() {
141-
this.#transactionClient = this.#transactionClient ?? new PlanetScaleConnection(this.#config)
153+
this.#transactionClient = this.#transactionClient ?? new PlanetScaleConnection(this.#config, true)
142154
await this.#transactionClient.#conn.execute('BEGIN')
143155
}
144156

0 commit comments

Comments
 (0)