@@ -2,6 +2,8 @@ package main
22
33import (
44 "database/sql"
5+ "sync"
6+ "sync/atomic"
57)
68
79func bmSimpleExec (db * sql.DB , n int ) error {
@@ -222,3 +224,99 @@ func bmSelectPreparedLargeRaw(db *sql.DB, n int) error {
222224 }
223225 return nil
224226}
227+
228+ func runPreparedExecConcurrent (db * sql.DB , n int , co int ) error {
229+ stmt , err := db .Prepare ("DO 1" )
230+ if err != nil {
231+ return err
232+ }
233+
234+ remain := int64 (n )
235+ var wg sync.WaitGroup
236+ wg .Add (co )
237+
238+ for i := 0 ; i < co ; i ++ {
239+ go func () {
240+ for {
241+ if atomic .AddInt64 (& remain , - 1 ) < 0 {
242+ wg .Done ()
243+ return
244+ }
245+
246+ if _ , err1 := stmt .Exec (); err1 != nil {
247+ wg .Done ()
248+ err = err1
249+ return
250+ }
251+ }
252+ }()
253+ }
254+ wg .Wait ()
255+ stmt .Close ()
256+ return err
257+ }
258+
259+ func bmPreparedExecConcurrent2 (db * sql.DB , n int ) error {
260+ return runPreparedExecConcurrent (db , n , 2 )
261+ }
262+
263+ func bmPreparedExecConcurrent4 (db * sql.DB , n int ) error {
264+ return runPreparedExecConcurrent (db , n , 4 )
265+ }
266+
267+ func bmPreparedExecConcurrent8 (db * sql.DB , n int ) error {
268+ return runPreparedExecConcurrent (db , n , 8 )
269+ }
270+
271+ func bmPreparedExecConcurrent16 (db * sql.DB , n int ) error {
272+ return runPreparedExecConcurrent (db , n , 16 )
273+ }
274+
275+ func runPreparedQueryConcurrent (db * sql.DB , n int , co int ) error {
276+ stmt , err := db .Prepare ("SELECT ?, \" foobar\" " )
277+ if err != nil {
278+ return err
279+ }
280+
281+ remain := int64 (n )
282+ var wg sync.WaitGroup
283+ wg .Add (co )
284+
285+ for i := 0 ; i < co ; i ++ {
286+ go func () {
287+ var id int
288+ var str string
289+ for {
290+ if atomic .AddInt64 (& remain , - 1 ) < 0 {
291+ wg .Done ()
292+ return
293+ }
294+
295+ if err1 := stmt .QueryRow (i ).Scan (& id , & str ); err1 != nil {
296+ wg .Done ()
297+ err = err1
298+ return
299+ }
300+ }
301+ }()
302+ }
303+ wg .Wait ()
304+ stmt .Close ()
305+ return err
306+ }
307+
308+ func bmPreparedQueryConcurrent2 (db * sql.DB , n int ) error {
309+ return runPreparedQueryConcurrent (db , n , 2 )
310+ }
311+
312+ func bmPreparedQueryConcurrent4 (db * sql.DB , n int ) error {
313+ return runPreparedQueryConcurrent (db , n , 4 )
314+ }
315+
316+ func bmPreparedQueryConcurrent8 (db * sql.DB , n int ) error {
317+ return runPreparedQueryConcurrent (db , n , 8 )
318+ }
319+
320+ func bmPreparedQueryConcurrent16 (db * sql.DB , n int ) error {
321+ return runPreparedQueryConcurrent (db , n , 16 )
322+ }
0 commit comments