MYSQL returns 当我尝试在一个事务中添加超过一百个条目时出现最大连接池错误

MYSQL returns MAXIMUM CONNECTION POOL error when I try to add more then hundred entries in one transaction

我有股票数据库应用程序,因此用户将所有项目输入到稍后添加到数据库的数据网格中,但是只要项目超过 100 个项目,它就会 returns 错误:

Error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

代码如下:

 For Each row As DataGridViewRow In DGV_ITEMS.Rows

        If row.IsNewRow = False Then

            Dim ITEM_CODE_VAL As Double = row.Cells(1).Value
            Dim ITEM_QUANTITY_VAL = row.Cells(2).Value
            Dim ITEM_NAME_VAL = row.Cells(3).Value
            Dim ITEM_PRICE_VAL = row.Cells(4).Value
            Dim ITEM_DATE_VAL = row.Cells(5).Value

            'FOR CHECK IF SUPPLIER ALL READY EXISTS
            Dim CON1 As New MySqlConnection("server=localhost; username=root; password=pwd; database=airtech_db;")
            Dim CMD1 As New MySqlCommand("SELECT * FROM `STOCK` where `ITEM_CODE`='" & row.Cells(1).Value & "';", con1)
            Dim dt1 As New DataTable
            Dim DR1 As MySqlDataReader
            CON1.Open()
            dt1.Clear()
            With dt1
                DR1 = CMD1.ExecuteReader
                DR1.Read()
                If DR1.HasRows = True Then
                    'MsgBox("Item already exists")
                    Call ADD_DATA_TO_EXISTING_RECORD(ITEM_CODE_VAL, ITEM_QUANTITY_VAL)
                    CON1.Close()
                Else
                    'Using con As New MySqlConnection(constring)
                    Using cmd As New MySqlCommand("Insert into `stock` values(null,@ITEM_CODE,@ITEM_NAME,@ITEM_PRICE,@ITEM_QUANTITY,@SALE_PRICE,@STOCK_DATE,'N/A');", con)
                        Try
                            Dim CON As New MySqlConnection("server=localhost; username=root; password=pwd; database=airtech_db;")
                            con.Open()
                            cmd.Parameters.AddWithValue("@ITEM_CODE", row.Cells(1).Value)
                            cmd.Parameters.AddWithValue("@ITEM_NAME", row.Cells(3).Value)
                            cmd.Parameters.AddWithValue("@ITEM_PRICE", row.Cells(4).Value)
                            cmd.Parameters.AddWithValue("@ITEM_QUANTITY", row.Cells(2).Value)
                            cmd.Parameters.AddWithValue("@SALE_PRICE", row.Cells(5).Value)
                            cmd.Parameters.AddWithValue("@STOCK_DATE", Date.Now.ToString("yyyy-MM-dd"))
                            cmd.ExecuteNonQuery()
                        Finally
                            con.Close()
                        End Try

                    End Using
                    'End Using

                End If
            End With
        End If
    Next

如果在循环中进行查询,将连接字符串移出循环,让命令和数据读取器在循环内完成工作

例如

Using con As New MySqlConnection(constring)
        con.Open()
        'any for Loop you want to run

        Using cmd As New MySqlCommand("Insert into `stock` values(null,@ITEM_CODE,@ITEM_NAME,@ITEM_PRICE,@ITEM_QUANTITY,@SALE_PRICE,@STOCK_DATE,'N/A');", con)
            cmd.Parameters.AddWithValue("@ITEM_CODE", row.Cells(1).Value)
            cmd.Parameters.AddWithValue("@ITEM_NAME", row.Cells(3).Value)
            cmd.Parameters.AddWithValue("@ITEM_PRICE", row.Cells(4).Value)
            cmd.Parameters.AddWithValue("@ITEM_QUANTITY", row.Cells(2).Value)
            cmd.Parameters.AddWithValue("@SALE_PRICE", row.Cells(5).Value)
            cmd.Parameters.AddWithValue("@STOCK_DATE", Date.Now.ToString("yyyy-MM-dd"))
            cmd.ExecuteNonQuery()
        End Using
    End Using
    Next
    con.Close()