


How to set the maximum number of connections and the maximum number of idle connections in golang combined with mysql
The maximum number of connections and the maximum number of idle connections are defined in database/sql in the golang standard library.
The SQL driver package used in the example to connect to MySQL is github.com/go-sql-driver/mysql.
The interface for setting the maximum number of connections is
func (db *DB) SetMaxOpenConns(n int)
Setting the connection The maximum number of connections that MySQL can open.
If n <= 0, it means there is no limit on the number of open connections.
The default is 0, which means there is no limit on the number of connections.
Another parameter related to the number of connections is MaxIdleConns, which represents the maximum number of idle connections.
If MaxIdleConns is greater than 0 and greater than MaxOpenConns, then MaxIdleConns will be adjusted to be equal to MaxOpenConns, and the excess connections will be closed when there are excess connections.
The interface for setting the maximum number of idle connections is:
func (db *DB) SetMaxIdleConns(n int)
When n<=0, the idle connection pool will not be used, that is, when the idle connection pool is not used, the unused connections will will not be stored in it. Therefore, this method does not reuse the connection, and a new connection needs to be re-established every time a SQL statement is executed. <=0时,空闲连接池不会被使用,即不使用空闲连接池时,未使用的连接将不会被存入其中。因此,这种方法不会重复利用连接,每次执行SQL语句都需要重新建立新的连接。
The default maximum number of idle connections is 2:
const defaultMaxIdleConns = 2
Regarding the relationship between open connections and idle connections, please add:
Opened connection = connection in use (inuse) connection in idle state (idle)
Let’s test and verify the maximum number of connections and the maximum number of idle connections.
1. Maximum number of connections test
First set the maximum number of open connections to 1, then open 20 goroutines, each goroutine executes the sql statement, and prints the connection id of the connection used to execute the sql . Observe the execution of other Goroutines that need to execute SQL when executing time-consuming SQL statements occupying connections.
The example code is as follows:
package main import ( "database/sql" "log" _ "github.com/go-sql-driver/mysql" ) var DB *sql.DB var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true" func Init() { var err error DB, err = sql.Open("mysql", dataBase) if err != nil { log.Fatalln("open db fail:", err) } DB.SetMaxOpenConns(1) err = DB.Ping() if err != nil { log.Fatalln("ping db fail:", err) } } func main() { Init() //开启20个goroutine for i:=0; i < 20; i++ { go one_worker(i) } select { } } func one_worker(i int) { var connection_id int err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id) if err != nil { log.Println("query connection id failed:", err) return } log.Println("worker:", i, ", connection id:", connection_id) var result int err = DB.QueryRow("select sleep(10)").Scan(&result) if err != nil { log.Println("query sleep connection id faild:", err) return } }
output
2019/10/02 18:14:25 worker: 2, connection id: 55
2019/ 10/02 18:14:25 worker: 17 , connection id: 55
2019/10/02 18:14:25 worker: 11 , connection id: 55
2019/10/02 18:14:35 worker: 3 , connection id: 55
2019/10/02 18:14:45 worker: 0 , connection id: 55
2019/10/02 18:14:45 worker: 4 , connection id: 55
2019/10/02 18:14:45 worker: 5 , connection id: 55
2019/10/02 18:15:05 worker: 7 , connection id: 55
2019/10/02 18:15:25 worker: 15 , connection id: 55
2019/10/02 18:15:25 worker: 6 , connection id: 55
2019/10/02 18:15:35 worker: 13 , connection id: 55
2019/10/02 18:15:45 worker: 19 , connection id: 55
2019/10/02 18:15:45 worker: 10 , connection id: 55
2019/10/02 18:15:45 worker: 12 , connection id: 55
2019/10/02 18:15:55 worker: 14 , connection id: 55
2019/10/02 18:16 :15 worker: 8 , connection id: 55
2019/10/02 18:16:35 worker: 18 , connection id: 55
2019/10/02 18:16:35 worker: 1 , connection id : 55
2019/10/02 18:17:05 worker: 16 , connection id: 55
2019/10/02 18:17:35 worker: 9 , connection id: 55
Use show processlist to view the connection
mysql> show processlist; +----+------+-----------------+------+---------+------+------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------------+------+---------+------+------------+------------------+ | 20 | root | localhost | NULL | Query | 0 | starting | show processlist | | 55 | root | localhost:59518 | NULL | Query | 5 | User sleep | select sleep(10) | +----+------+-----------------+------+---------+------+------------+------------------+ 2 rows in set (0.00 sec)
Use netstat to view the connection
netstat -an | grep 3306 tcp4 0 0 127.0.0.1.3306 127.0.0.1.59518 ESTABLISHED tcp4 0 0 127.0.0.1.59518 127.0.0.1.3306 ESTABLISHED tcp46 0 0 *.3306 *.* LISTEN
As you can see from the results, 20 goroutines take turns using the same connection (connection id is 55) to execute sql statements.
Other goroutines will enter the blocking state when the connection is occupied. No other goroutine can use the connection until the connection is used up.
Even if multiple goroutines are executing SQL, multiple connections are not created.
Therefore, the maximum number of connections setting takes effect.
Some readers may ask, if they have not seen the maximum number of idle connections set, what is the maximum number of space connections at this time?
As mentioned before, the default maximum number of idle connections is 2.
Let’s test the maximum number of space connections.
2. Maximum number of idle connections test
In the following example, set the maximum number of connections to 1 and the maximum number of idle connections to 0.
And execute a SQL every 3 seconds statement.
The code is as follows:
package main import ( "database/sql" "log" "time" _ "github.com/go-sql-driver/mysql" ) var DB *sql.DB var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true" func mysqlInit() { var err error DB, err = sql.Open("mysql", dataBase) if err != nil { log.Fatalln("open db fail:", err) } DB.SetMaxOpenConns(1) DB.SetMaxIdleConns(0) err = DB.Ping() if err != nil { log.Fatalln("ping db fail:", err) } } func main() { mysqlInit() for { execSql() time.Sleep(3*time.Second) } } func execSql() { var connection_id int err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id) if err != nil { log.Println("query connection id failed:", err) return } log.Println("connection id:", connection_id) }
output:
2019/10/13 23:06:00 connection id: 26
2019/10/13 23 :06:03 connection id: 27
2019/10/13 23:06:06 connection id: 28
2019/10/13 23:06:09 connection id: 29
2019/10/13 23:06:12 connection id: 30
2019/10/13 23:06:15 connection id: 31
2019/10/13 23:06:18 connection id: 32
2019/10/ 13 23:06:21 connection id: 33
2019/10/13 23:06:24 connection id: 34
2019/10/13 23:06:27 connection id: 35
2019/10 /13 23:06:30 connection id: 36
2019/10/13 23:06:33 connection id: 37
2019/10/13 23:06:36 connection id: 38
As can be seen from the results, the connection id used is different each time SQL is executed.
Set the maximum number of idle connections to 0. After each execution of SQL, the connection will not be put into the idle connection pool, but will be closed. The next time SQL is executed, a new connection will be re-established.
The above is the detailed content of How to set the maximum number of connections and the maximum number of idle connections in golang combined with mysql. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

MySQL's position in databases and programming is very important. It is an open source relational database management system that is widely used in various application scenarios. 1) MySQL provides efficient data storage, organization and retrieval functions, supporting Web, mobile and enterprise-level systems. 2) It uses a client-server architecture, supports multiple storage engines and index optimization. 3) Basic usages include creating tables and inserting data, and advanced usages involve multi-table JOINs and complex queries. 4) Frequently asked questions such as SQL syntax errors and performance issues can be debugged through the EXPLAIN command and slow query log. 5) Performance optimization methods include rational use of indexes, optimized query and use of caches. Best practices include using transactions and PreparedStatemen

Apache connects to a database requires the following steps: Install the database driver. Configure the web.xml file to create a connection pool. Create a JDBC data source and specify the connection settings. Use the JDBC API to access the database from Java code, including getting connections, creating statements, binding parameters, executing queries or updates, and processing results.

The process of starting MySQL in Docker consists of the following steps: Pull the MySQL image to create and start the container, set the root user password, and map the port verification connection Create the database and the user grants all permissions to the database

The main role of MySQL in web applications is to store and manage data. 1.MySQL efficiently processes user information, product catalogs, transaction records and other data. 2. Through SQL query, developers can extract information from the database to generate dynamic content. 3.MySQL works based on the client-server model to ensure acceptable query speed.

Laravel is a PHP framework for easy building of web applications. It provides a range of powerful features including: Installation: Install the Laravel CLI globally with Composer and create applications in the project directory. Routing: Define the relationship between the URL and the handler in routes/web.php. View: Create a view in resources/views to render the application's interface. Database Integration: Provides out-of-the-box integration with databases such as MySQL and uses migration to create and modify tables. Model and Controller: The model represents the database entity and the controller processes HTTP requests.

The key to installing MySQL elegantly is to add the official MySQL repository. The specific steps are as follows: Download the MySQL official GPG key to prevent phishing attacks. Add MySQL repository file: rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm Update yum repository cache: yum update installation MySQL: yum install mysql-server startup MySQL service: systemctl start mysqld set up booting

Installing MySQL on CentOS involves the following steps: Adding the appropriate MySQL yum source. Execute the yum install mysql-server command to install the MySQL server. Use the mysql_secure_installation command to make security settings, such as setting the root user password. Customize the MySQL configuration file as needed. Tune MySQL parameters and optimize databases for performance.

I encountered a tricky problem when developing a small application: the need to quickly integrate a lightweight database operation library. After trying multiple libraries, I found that they either have too much functionality or are not very compatible. Eventually, I found minii/db, a simplified version based on Yii2 that solved my problem perfectly.
