Я хотел бы предвосхитить это, сказав, что я никогда не работал с базами данных Microsoft и ASP.NET. Мне нужно исправить этот проект, но я не совсем знаком с тем, как он работает.
Таким образом, на сайте есть простой, сделанный на заказ интернет-магазин, без регистрации пользователя. Для каждого пользователя генерируется индивидуальный ключ, который длится недолго (пару минут) и используется для различения разных пользователей и их корзин, в основном сессионный ключ. Каждый раз, когда пользователь добавляет продукт в корзину, новое соединение с базой данных открыто, и база данных остается открытой, но она все еще доступна для других пользователей, поэтому никаких проблем с этой частью.
У пользователя есть возможность добавлять товары в корзину, и это отлично работает. Проблема возникает, если пользователь добавляет слишком много товаров в корзину. Слишком много около 8-9 товаров, после чего сайт возвращает [OleDbException (0x80004005): Unspecified error]
.
[OleDbException (0x80004005): Unspecified error]
System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) +966653
System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) +86
System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) +29
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +4911420
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
System.Data.OleDb.OleDbConnection.Open() +40
piDataSloj.cDataSloj.DajDataReader(String mSq) +224
LucLib.cStavka.Load() +216
Lucel.Proizvodi.ibUKos_Click(Object sender, CommandEventArgs e) +1519
System.Web.UI.WebControls.CommandEventHandler.Invoke(Object sender, CommandEventArgs e) +0
System.Web.UI.WebControls.ImageButton.OnCommand(CommandEventArgs e) +8842310
System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +176
System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
При открытии корзины общая стоимость по-прежнему отображается, но все добавленные продукты больше не отображаются. Любой пользователь, пытающийся открыть хранилище, получит то же исключение выше, пока не истечет срок действия ключа сеанса. Таким образом, очевидно, что ничего не может быть загружено из базы данных после возникновения исключения.
Итак, мой вопрос: что может быть причиной такого поведения?
По сути, те же самые методы, которые вызываются для добавления продуктов, прекрасно работают в течение X раз, затем в какой-то момент что-то идет не так, и все зависает. Возможно ли, что где-то в коде соединение с базой данных не закрывается должным образом, поэтому после 8 открытых соединений их слишком много и все зависает? Это единственное, о чем я могу пока думать.
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.UI;
namespace piDataSloj
{
/// <summary>
/// Objekti za pristup bazi
/// </summary>
public class cDataSloj : System.Web.UI.Page
{
private string sDbs = ConfigurationSettings.AppSettings["dbLuc"].ToString();
private string sDb;
private OleDbConnection cDb;
private OleDbCommand cmd;
private string returnedString;
#region " DajDataReader, DajScalar, DajNonQuery, DajDataTable metode "
public OleDbDataReader DajDataReader(string mSq)
{
sDb = "Provider=Microsoft.Jet.OleDb.4.0; Data Source="+ Server.MapPath(sDbs);
cDb = new OleDbConnection(sDb);
cmd = new OleDbCommand(mSq, cDb);
cDb.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
public string DajScalar(string mSq)
{
sDb = "Provider=Microsoft.Jet.OleDb.4.0; Data Source="+ Server.MapPath(sDbs);
cDb = new OleDbConnection(sDb);
cmd = new OleDbCommand(mSq, cDb);
cDb.Open();
try
{
returnedString = cmd.ExecuteScalar().ToString();
}
catch
{
returnedString = string.Empty;
}
finally
{
cDb.Close();
}
return returnedString;
}
public string DajNonQuery(string mSq)
{
sDb = "Provider=Microsoft.Jet.OleDb.4.0; Data Source="+ Server.MapPath(sDbs);
cDb = new OleDbConnection(sDb);
cmd = new OleDbCommand(mSq, cDb);
cDb.Open();
returnedString = cmd.ExecuteNonQuery().ToString();
cDb.Close();
return returnedString;
}
public DataTable DajDataTable(string mSq)
{
sDb = "Provider=Microsoft.Jet.OleDb.4.0; Data Source="+ Server.MapPath(sDbs);
cmd = new OleDbCommand();
cDb = new OleDbConnection(sDb);
OleDbDataAdapter da = new OleDbDataAdapter(mSq, cDb);
DataTable dt = new DataTable();
da.Fill(dt);
da.Dispose();
return dt;
}
#endregion
#region " Dispose metoda "
public void Zatvori()
{
cmd.Dispose();
if (cDb.State.ToString() == "Open") { cDb.Close(); }
cDb.Dispose();
}
#endregion
}
}