@@ -8,10 +8,10 @@ import (
8
8
"log/slog"
9
9
"net/http"
10
10
"os"
11
- "sync"
12
11
"time"
13
12
14
13
sqlrunner "github.com/database-playground/sqlrunner/lib"
14
+ lru "github.com/hashicorp/golang-lru/v2"
15
15
"golang.org/x/sync/singleflight"
16
16
)
17
17
@@ -21,7 +21,15 @@ func main() {
21
21
addr = ":" + os .Getenv ("PORT" )
22
22
}
23
23
24
- service := & SqlQueryService {}
24
+ runnersCache , err := lru.New [string , * sqlrunner.SQLRunner ](20 )
25
+ if err != nil {
26
+ slog .Error ("failed to create LRU cache for runners" , slog .Any ("error" , err ))
27
+ os .Exit (1 )
28
+ }
29
+
30
+ service := & SqlQueryService {
31
+ runnersCache : runnersCache ,
32
+ }
25
33
http .Handle ("POST /query" , service )
26
34
27
35
slog .Info ("Listening" , slog .String ("addr" , addr ))
@@ -32,9 +40,8 @@ func main() {
32
40
}
33
41
34
42
type SqlQueryService struct {
35
- // fixme: lru
36
- runners sync.Map
37
- sfgroup singleflight.Group
43
+ runnersCache * lru.Cache [string , * sqlrunner.SQLRunner ]
44
+ sfgroup singleflight.Group
38
45
}
39
46
40
47
func (s * SqlQueryService ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
@@ -75,9 +82,9 @@ func (s *SqlQueryService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
75
82
76
83
func (s * SqlQueryService ) findRunner (schema string ) (* sqlrunner.SQLRunner , error ) {
77
84
// If we have already prepared a runner for this schema, return it.
78
- runner , ok := s .runners . Load (schema )
85
+ runner , ok := s .runnersCache . Get (schema )
79
86
if ok {
80
- return runner .( * sqlrunner. SQLRunner ) , nil
87
+ return runner , nil
81
88
}
82
89
83
90
result , err , _ := s .sfgroup .Do (schema , func () (any , error ) {
@@ -86,16 +93,14 @@ func (s *SqlQueryService) findRunner(schema string) (*sqlrunner.SQLRunner, error
86
93
return nil , fmt .Errorf ("create SQLRunner: %w" , err )
87
94
}
88
95
89
- s .runners . Store (schema , newRunner )
96
+ s .runnersCache . Add (schema , newRunner )
90
97
return newRunner , nil
91
98
})
92
99
if err != nil {
93
100
return nil , err
94
101
}
95
102
96
103
typedResult := result .(* sqlrunner.SQLRunner )
97
-
98
- s .runners .Store (schema , typedResult )
99
104
return typedResult , err
100
105
}
101
106
0 commit comments