@@ -8,10 +8,10 @@ import (
88 "log/slog"
99 "net/http"
1010 "os"
11- "sync"
1211 "time"
1312
1413 sqlrunner "github.com/database-playground/sqlrunner/lib"
14+ lru "github.com/hashicorp/golang-lru/v2"
1515 "golang.org/x/sync/singleflight"
1616)
1717
@@ -21,7 +21,15 @@ func main() {
2121 addr = ":" + os .Getenv ("PORT" )
2222 }
2323
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+ }
2533 http .Handle ("POST /query" , service )
2634
2735 slog .Info ("Listening" , slog .String ("addr" , addr ))
@@ -32,9 +40,8 @@ func main() {
3240}
3341
3442type SqlQueryService struct {
35- // fixme: lru
36- runners sync.Map
37- sfgroup singleflight.Group
43+ runnersCache * lru.Cache [string , * sqlrunner.SQLRunner ]
44+ sfgroup singleflight.Group
3845}
3946
4047func (s * SqlQueryService ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
@@ -75,9 +82,9 @@ func (s *SqlQueryService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7582
7683func (s * SqlQueryService ) findRunner (schema string ) (* sqlrunner.SQLRunner , error ) {
7784 // 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 )
7986 if ok {
80- return runner .( * sqlrunner. SQLRunner ) , nil
87+ return runner , nil
8188 }
8289
8390 result , err , _ := s .sfgroup .Do (schema , func () (any , error ) {
@@ -86,16 +93,14 @@ func (s *SqlQueryService) findRunner(schema string) (*sqlrunner.SQLRunner, error
8693 return nil , fmt .Errorf ("create SQLRunner: %w" , err )
8794 }
8895
89- s .runners . Store (schema , newRunner )
96+ s .runnersCache . Add (schema , newRunner )
9097 return newRunner , nil
9198 })
9299 if err != nil {
93100 return nil , err
94101 }
95102
96103 typedResult := result .(* sqlrunner.SQLRunner )
97-
98- s .runners .Store (schema , typedResult )
99104 return typedResult , err
100105}
101106
0 commit comments