Skip to main content

The way I use go (golang) sql/mysql driver to create connection

I use go for web development and I have noticed I have a few problems with database connections to mysql using go-sql-driver/mysql.

Database connections created and then never closed. I reached a point of 4,096 simultaneous connections and my mysql server have reached max-connections which reached a denial of service.

I had to play a bit with some tweaking of the code and this is what I have reached:

db.SetMaxOpenConns(200) // this works occasionally 

db.SetMaxIdleConns(30) // this does not work but I keep it anyway

db.SetConnMaxLifetime(time.Second * 30) // this also does not work but I keep it

db.Exec("SET SESSION wait_timeout = 30") // this works

db.Exec("SET SESSION interactive_timeout = 30") // and also this one

Using the above directive I was able to have the number of connections under control. Please note that sometimes I still get more than 200 connections even though I set the maximum to 200, and sometimes it keeps the max 200.

SetMaxIdleConns and SetConnMaxLifetime - did not have any affect what so ever.

Again, it might be that I am not fully aware of the configuration or the right usage.

Here below is my full function to get a connection to the database with go mysql driver:


package main

import (
	"database/sql"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql" // Register the driver
)

func GetConnection(whereFrom string) (*sql.DB, error) {
	return createConnection()
}

// create a real connection to the database
func createConnection() (*sql.DB, error) {
	var err error

	db, err := sql.Open("mysql", "user:password@tcp(IP:3306)/databasename?charset=utf8mb3")
	if err != nil {
		log.Fatal("error 20241212.01314 createConnection error: " + err.Error())
		return nil, err
	}

	db.SetMaxOpenConns(200)                 // Set max open connections
	db.SetMaxIdleConns(30)                  // Set max idle connections
	db.SetConnMaxLifetime(time.Second * 30) // Set the max lifetime of a connection

	// Setting session-specific parameters
	_, err = db.Exec("SET SESSION wait_timeout = 30") // 30 seconds
	if err != nil {
		log.Fatal("error 20241212.01641 set wait_timeout error: " + err.Error())
		return nil, err
	}

	_, err = db.Exec("SET SESSION interactive_timeout = 30") // 30 seconds
	if err != nil {
		log.Fatal("error 20241212.01642 set interactive_timeout error: " + err.Error())
		return nil, err
	}

	return db, nil
}

Comments

Popular posts from this blog

Using phpword to merge two Mircrosoft Office Word .docx documents

How to combine or embed and insert another .docx file (Microsoft office docx word document) into another one using PHPWord Joining two .docx document using php ( phpword library ) $mainTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file1"); //$mainTemplateProcessor ->setValue('var_name', $value); $innerTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file2"); //$innerTemplateProcessor->setValue('var2_name', $value2); // extract internal xml from template that will be merged inside main template $innerXml = $innerTemplateProcessor->gettempDocumentMainPart(); $innerXml = preg_replace('/^[\s\S]*<w:body>(.*)<\/w:body>.*/', '$1', $innerXml); // remove tag containing header, footer, images $innerXml = preg_replace('/<w:sectPr>.*<\/w:sectPr>/', '', $innerXml); // inject internal xml inside main template $mainXml = $mainTemplateProcessor->gettempDocumentMainPart(...

Bypassing the error by "go get" "tls: failed to verify certificate: x509: certificate signed by unknown authority"

When I was trying to download dependencies for my go project in an old Ubuntu machine I was getting this error all the time: "go: gopkg.in/alexcesaro/quotedprintable.v3@v3.0.0-20150716171945-2caba252f4dc: Get "https://proxy.golang.org/gopkg.in/alexcesaro/quotedprintable.v3/@v/v3.0.0-20150716171945-2caba252f4dc.mod": tls: failed to verify certificate: x509: certificate signed by unknown authority" Which the main part of it was go get failing to authenticate: " tls: failed to verify certificate: x509: certificate signed by unknown authority " I tried many things but couldn't make it work until I found the way: export GOINSECURE="proxy.golang.go" This will tell go get to ignore certification validity. Then export GOPROXY=direct This will tell go get to by pass proxy Then git config --global http.sslverify false And only after those I could run again: go get And it worked

Accessing Windows Share (Samba) From Linux (XFCE) using Thunar

In order to access samba (windows share) from Linux XFCE using Thunar file browser you need to: 1. Install samba client sudo apt install smbclient 2. Run: sudo modprobe cifs 3. Open thunar and access the share: smb://IPADDRESS/sharename e.g.: smb://192.168.1.1/photos 4. Type in the username / password in the prompt window Some helpful information: https://forum.manjaro.org/t/thunar-how-do-i-access-folders-shared-on-windows-computers/116649/9