Оптимальное отображение картинок из БД.
1. При каждом вызове HttpHandler'a открывать соединение с БД.
Код:
string ConString = WebConfigurationManager.ConnectionStrings["test"].ConnectionString;
string id = context.Request.QueryString["id"];
SqlConnection conn = new SqlConnection(ConString);
SqlCommand cmd = new SqlCommand("Select img from id where id=@id", conn);
cmd.Parameters.Add("@id", id);
try
{
conn.Open();
SqlDataReader rd = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
if (rd.Read())
{
int bufferSize = 100;
byte[] bytes = new byte[bufferSize];
long bytesRead;
long readFrom = 0;
do
{
bytesRead = rd.GetBytes(0, readFrom, bytes, 0, bufferSize);
context.Response.BinaryWrite(bytes);
readFrom += bufferSize;
} while (bytesRead == bufferSize);
rd.Close();
conn.Close();
string id = context.Request.QueryString["id"];
SqlConnection conn = new SqlConnection(ConString);
SqlCommand cmd = new SqlCommand("Select img from id where id=@id", conn);
cmd.Parameters.Add("@id", id);
try
{
conn.Open();
SqlDataReader rd = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
if (rd.Read())
{
int bufferSize = 100;
byte[] bytes = new byte[bufferSize];
long bytesRead;
long readFrom = 0;
do
{
bytesRead = rd.GetBytes(0, readFrom, bytes, 0, bufferSize);
context.Response.BinaryWrite(bytes);
readFrom += bufferSize;
} while (bytesRead == bufferSize);
rd.Close();
conn.Close();
2. При запросе страницы картинки записываются в Cache (30 секунд). И в HttpHandler'e постоянно проверяется на наличие данных в Cache, если их нет, то они заново запрашиваются из БД.
Всё было бы отлично с этим Cache, но таких картинок имеется очень много, ну порядка 200 мБ. Но для пула данного приложения есть ограничение по памяти на 100 Мб. Т.е. при привышении данного
лимита некоторые данные Cache вытеснятся принудительно.
Отсюда вопрос: какой вариант предпочтительнее в отношении производительности? Что будет дороже удержание данных в Cache и вытеснение их в случае нехватки памяти. Или производить на каждой странице 10 подключений к Бд.
Данная страница планируестя на 10 одновременных пользователей.
Заранее спасибо за советы.
Разве ни у кого нету предположений?
На мой взгляд стоило бы подумать об умной реализации кеша, в любом случае какие-то картинки запрашиваются чаще какие-то реже, т.е. надо сделать что-то вроде стека с определенным временем жизни каждого элемента, и коэффициэнетом, определяющим целесообразность содержания каждого элемента в кеше (что-то вроде промежуток времени/кол-во запросов). Таким образом можно получить оптимальное решение которое будет представлять нечто среднее между предложенными вариантами.
Можно использовать кэш для хранения изображений не в пределах сессии одного пользователя, а общий кэш для всех пользователей. Если ни один пользователь не использует картинку из кэша тут же её удалять. Если хотя бы один пользователь использует картинку, грузить в кэш значит. Хотя осбой проблемы здесь нет, т.к. быстродействие твоей программы несопоставимо с пингом, и даже если не будет кэша пользователь разницы в быстродействии не увидит.