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()
我有股票数据库应用程序,因此用户将所有项目输入到稍后添加到数据库的数据网格中,但是只要项目超过 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()