Hur gör man en connection pool med connections som delas. Jag har uppfattadet som att ADO automatisk har en connection pool. Du använder dig av denna genom att öppna din anslutning med en identisk connectionstring. Jag har uppfattadet som att ADO automatisk har en connection pool. Du använder dig av denna genom att öppna din anslutning med en identisk connectionstring. Connection pool
(någon som har ett exempel)
Då man vill ha databasinformation till sin hemsida.
Har hört att detta skall vara det bästa om man vill klara flera samtidiga besökare!Sv: Connection pool
Hur connection pool i ado fungerar kan kort beskrivas som följande:
* Du öppnar en connection
+ ADO kontrollerar om det finns en connection i connection pool'en med identisk connectionstring
Om det finns det:
Hämtas denna från connection pool'en och tas sammtidigt bort från connection pool'en
Om inte:
Skapas en ny connection
(* Du gör databas anrop genom din connection)
* Du stänger din anslutning genom ADO
+ Din anslutning stängs inte internt i ADO utan läggs i connection pool'en där den frigörs efter en viss angiven tid
Det är därför viktigt att du använder dig av ett connection objekt när du arbetar mot ADO objekt. T.ex. Recordset:
<code>
Dim rs1
Dim rs2
Dim con
Dim strConnectionString
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Medlem.mdb") & ";" & _
"Persist Security Info=False"
Set con = CreateObject("ADODB.Connection")
con.Open strConnectionString
Set rs1 = con.Execute("SELECT tblOrders.* FROM tblOrders")
Set rs2 = CreateObject("ADODB.Recordset")
Do Until rs1.EOF
'Write order row
rs2.Open "SELECT tblOrderItems.* FROM tblOrderItems WHERE tblOrderItems.OrderItemOrder = " & rs1("OrderId"), con
Do Until rs2.EOF
'Write orderitem row
rs2.MoveNext
Loop
rs2.Close
rs1.MoveNext
Loop
Set rs2 = Nothing
rs1.Close
Set rs1= Nothing
con.Close
Set con = Nothing
</code>
INTE gör på följande sätt:
<code>
Dim rs1
Dim rs2
Dim strConnectionString
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Medlem.mdb") & ";" & _
"Persist Security Info=False"
Set rs1 = CreateObject("ADODB.Recordset")
rs1.Open "SELECT tblOrders.* FROM tblOrders", strConnectionString
Set rs2 = CreateObject("ADODB.Recordset")
Do Until rs1.EOF
'Write order row
rs2.Open "SELECT tblOrderItems.* FROM tblOrderItems WHERE tblOrderItems.OrderItemOrder = " & rs1("OrderId"), strConnectionString
Do Until rs2.EOF
'Write orderitem row
rs2.MoveNext
Loop
rs2.Close
rs1.MoveNext
Loop
Set rs2 = Nothing
rs1.Close
Set rs1= Nothing
</code>
Koden kan se ut att fungera likadant. men vad som sker är att recordseten internt skapar ett connection objekt av värdet från connectionstring. Sidan använder alltså två anslutningar istället för en. Om det är en asp sidan som kommer 10 samtida anrop öppna 20 anslutningar. Vilket är onödigt slöseri med resurser.Sv: Connection pool
Hur connection pool i ado fungerar kan kort beskrivas som följande:
* Du öppnar en connection
+ ADO kontrollerar om det finns en connection i connection pool'en med identisk connectionstring
Om det finns det:
Hämtas denna från connection pool'en och tas sammtidigt bort från connection pool'en
Om inte:
Skapas en ny connection
(* Du gör databas anrop genom din connection)
* Du stänger din anslutning genom ADO
+ Din anslutning stängs inte internt i ADO utan läggs i connection pool'en där den frigörs efter en viss angiven tid
Det är därför viktigt att du använder dig av ett connection objekt när du arbetar mot ADO objekt. T.ex. Recordset:
<code>
Dim rs1
Dim rs2
Dim con
Dim strConnectionString
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Medlem.mdb") & ";" & _
"Persist Security Info=False"
Set con = CreateObject("ADODB.Connection")
con.Open strConnectionString
Set rs1 = con.Execute("SELECT tblOrders.* FROM tblOrders")
Set rs2 = CreateObject("ADODB.Recordset")
Do Until rs1.EOF
'Write order row
rs2.Open "SELECT tblOrderItems.* FROM tblOrderItems WHERE tblOrderItems.OrderItemOrder = " & rs1("OrderId"), con
Do Until rs2.EOF
'Write orderitem row
rs2.MoveNext
Loop
rs2.Close
rs1.MoveNext
Loop
Set rs2 = Nothing
rs1.Close
Set rs1= Nothing
con.Close
Set con = Nothing
</code>
INTE gör på följande sätt:
<code>
Dim rs1
Dim rs2
Dim strConnectionString
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("Medlem.mdb") & ";" & _
"Persist Security Info=False"
Set rs1 = CreateObject("ADODB.Recordset")
rs1.Open "SELECT tblOrders.* FROM tblOrders", strConnectionString
Set rs2 = CreateObject("ADODB.Recordset")
Do Until rs1.EOF
'Write order row
rs2.Open "SELECT tblOrderItems.* FROM tblOrderItems WHERE tblOrderItems.OrderItemOrder = " & rs1("OrderId"), strConnectionString
Do Until rs2.EOF
'Write orderitem row
rs2.MoveNext
Loop
rs2.Close
rs1.MoveNext
Loop
Set rs2 = Nothing
rs1.Close
Set rs1= Nothing
</code>
Koden kan se ut att fungera likadant. men vad som sker är att recordseten internt skapar ett connection objekt av värdet från connectionstring. Sidan använder alltså två anslutningar istället för en. Om det är en asp sidan som kommer 10 samtida anrop öppna 20 anslutningar. Vilket är onödigt slöseri med resurser.