github.com/snowflakedb/gosnowflake@v1.9.0/cmd/noconnpool/noconnpool.go (about)

     1  // Example: No connection pool
     2  //
     3  // Setting the pool size to 1, a single session is used at all times. This guarantees USE <object type> <object name>
     4  // changes the current working object and subsequent commands can have the access.
     5  package main
     6  
     7  import (
     8  	"database/sql"
     9  	"flag"
    10  	"fmt"
    11  	"log"
    12  	"sync"
    13  
    14  	sf "github.com/snowflakedb/gosnowflake"
    15  )
    16  
    17  func main() {
    18  	if !flag.Parsed() {
    19  		flag.Parse()
    20  	}
    21  
    22  	cfg, err := sf.GetConfigFromEnv([]*sf.ConfigParam{
    23  		{Name: "Account", EnvName: "SNOWFLAKE_TEST_ACCOUNT", FailOnMissing: true},
    24  		{Name: "User", EnvName: "SNOWFLAKE_TEST_USER", FailOnMissing: true},
    25  		{Name: "Password", EnvName: "SNOWFLAKE_TEST_PASSWORD", FailOnMissing: true},
    26  		{Name: "Host", EnvName: "SNOWFLAKE_TEST_HOST", FailOnMissing: false},
    27  		{Name: "Port", EnvName: "SNOWFLAKE_TEST_PORT", FailOnMissing: false},
    28  		{Name: "Protocol", EnvName: "SNOWFLAKE_TEST_PROTOCOL", FailOnMissing: false},
    29  	})
    30  	if err != nil {
    31  		log.Fatalf("failed to create Config, err: %v", err)
    32  	}
    33  	dsn, err := sf.DSN(cfg)
    34  	if err != nil {
    35  		log.Fatalf("failed to create DSN from Config: %v, err: %v", cfg, err)
    36  	}
    37  
    38  	db, err := sql.Open("snowflake", dsn)
    39  	if err != nil {
    40  		log.Fatalf("failed to connect. err: %v", err)
    41  	}
    42  	// single session
    43  	db.SetMaxIdleConns(1)
    44  	db.SetMaxOpenConns(1)
    45  	defer db.Close()
    46  
    47  	var wg sync.WaitGroup
    48  	n := 10
    49  	wg.Add(n)
    50  	for i := 0; i < n; i++ {
    51  		go func() {
    52  			defer wg.Done()
    53  			query := "select current_session()"
    54  			rows, err := db.Query(query) // no cancel is allowed
    55  			if err != nil {
    56  				log.Fatalf("failed to run a query. %v, err: %v", query, err)
    57  			}
    58  			defer rows.Close()
    59  			var v int
    60  			for rows.Next() {
    61  				err := rows.Scan(&v)
    62  				if err != nil {
    63  					log.Fatalf("failed to get result. err: %v", err)
    64  				}
    65  				fmt.Printf("Session: %v\n", v)
    66  			}
    67  			if rows.Err() != nil {
    68  				fmt.Printf("ERROR: %v\n", rows.Err())
    69  				return
    70  			}
    71  		}()
    72  	}
    73  	fmt.Println("Waiting to finish...")
    74  	wg.Wait()
    75  	fmt.Printf("Congrats! You have successfully!\n")
    76  }