Изобретение велосипеда? (кеширование blob в фс)
От: Foror http://foror.ru
Дата: 16.05.07 10:50
Оценка:
Есть подобные решения в реализованом виде?

---
BlobProxy

Часто возникает необходимость прикреплять к доменам проекта различные файлы. Это может быть фотография пользователя, приложение к посту или топику, иконки к статьям и т.д.

Для хранения и связывания файла с доменом есть два наиболее простых и популярных варианта. Первый вариант, хранить файлы в файловой системе, а в таблице домена хранить путь на данный файл. Второй вариант, хранить файл в поле типа BLOB в таблице домена. Оба этих варианта имеют свои преимущества и недостатки. Первый вариант усложняет систему, т.к. необходимо поддерживать(делать backup, профилактики и т.д.) два хранилища(база данных и файловая система). Второй вариант имеет одно хранилище, но проигрывает в производительности. Т.к. необходимо держать открытое соединение(а это дорогой ресурс) с базой данных при отдаче файла из базы данных к пользователю(особенно в случае больших файлов).

Нам нужно одно хранилище и в тоже время нам нужна производительность близкая к первому варианту. Для этого нужно разработать кеширование файлов из поля BLOB в файловую систему.

interface BlobProxy {
    public File getFile(Object domain);

    public File getFile(Object domain, String field);
}

class HibernateBlobProxy implemenets BlobProxy {
    public HibernateBlobProxy(Session sess) {
    }

    public File getFile(Object domain) {
        // проверяем кеш на наличие и актуальность файла
        // находим первое blob поле в Class of domain
        // через sess вытаскиваем объект с blob
        // кешируем blob на диск, в файл 
        // возвращаем File() указывающий на кешированный blob
    }   
}
Re: Изобретение велосипеда? (кеширование blob в фс)
От: Blazkowicz Россия  
Дата: 16.05.07 12:24
Оценка:
Здравствуйте, Foror, Вы писали:

F>Часто возникает необходимость прикреплять к доменам проекта различные файлы. Это может быть фотография пользователя, приложение к посту или топику, иконки к статьям и т.д.


Вопрос уже 2 раза поднимался здесь и один раз недавно на другом "дружественном" форуме. Обсуждение сводится к велосипеду с выкладыванием файлов на непосредсевнно на http сервер. И обновлением их. Основная проблема которую я тут вижу это подружить не Java http сервер с секурити, наверняка реализованой на Java. Так как вопрос задается часто, то уже самому интересно узнать про готовые реализации. Если кто поделится интересными ссылками по теме, ооценку ждать долго не будет.
Re: Изобретение велосипеда? (кеширование blob в фс)
От: WFrag США  
Дата: 16.05.07 14:10
Оценка:
Здравствуйте, Foror, Вы писали:

F>Нам нужно одно хранилище и в тоже время нам нужна производительность близкая к первому варианту. Для этого нужно разработать кеширование файлов из поля BLOB в файловую систему.


Хм. А если просто поставить прозрачный кэширующий прокси, чтоб кэшировал файлы? Если файлы нечасто обновляются/меняются. Первичную копию хранить в BLOB-ах.
Re: Изобретение велосипеда? (кеширование blob в фс)
От: Аноним  
Дата: 17.05.07 09:47
Оценка:
Здравствуйте, Foror, Вы писали:

F>Есть подобные решения в реализованом виде?


вот набрел на решение соответствующее обсуждаемой теме :
http://www.opensymphony.com/oscache/

OSCache is a widely used, high performance J2EE caching framework.
The Problems Solved

OSCache solves fundamental problems for dynamic websites:

1. Caching Dynamic Content — Dynamic content of some form must often be executed during each request, but sometimes that content doesn't change every request. Caching the whole page does not help because sections of the page change every request.
* OSCache solves this problem by providing a means to cache sections of JSP pages.
2. Caching Binary Content — Generated images and PDFs can be very costly in terms of server load.
* OSCache solves this problem through a Servlet 2.3 CachingFilter which can cache any URI (such as an entire page or a generated image/PDF)
3. Error Tolerance — If one error occurs somewhere on your dynamic page, chances are the whole page will be returned as an error, even if 95% of the page executed correctly.
* OSCache solves this problem by allowing you to serve the cached content in the event of an error, and then reporting the error appropriately.

Brief Feature List

In addition to it's servlet-specific features, OSCache can be used as a generic caching solution for any Java application. A few of its generic features include:

* Caching of Arbitrary Objects — You are not restricted to caching portions of JSP pages or HTTP requests. Any Java object can be cached.
* Comprehensive API — The OSCache API gives you full programmatic control over all of OSCache's features.
* Persistent Caching — The cache can optionally be disk-based, thereby allowing expensive-to-create data to remain cached even across application restarts.
* Clustering — Support for clustering of cached data can be enabled with a single configuration parameter. No code changes required.
* Expiry of Cache Entries — You have a huge amount of control over how cached objects expire, including pluggable RefreshPolicies if the default functionality does not meet your requirements.

список фич :

http://www.opensymphony.com/oscache/wiki/Feature%20List.html

примеры :

http://www.theserverside.com/tt/articles/article.tss?l=OSCacheHelpsDatabases

ЗЫ: сам не пользовался, но планирую попробовать
Re[2]: Изобретение велосипеда? (кеширование blob в фс)
От: aka50 Россия  
Дата: 17.05.07 10:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Foror, Вы писали:


F>>Есть подобные решения в реализованом виде?


А>вот набрел на решение соответствующее обсуждаемой теме :

А>http://www.opensymphony.com/oscache/

Тут вопрос в другом. Необходим отдавать это как plain файлы и желательно вообще обычным http сервером типа lighttpd или apache.
Если нужно java решение, то уж лучше http://jakarta.apache.org/jcs/index.html

Решение же задачи в том виде, в котором хочется, требует написания некого модуля например для apache (типа mod_jk) который будет уметь:
1. Общаться с основоным java сервером посредством например hessian
2. Поддерживать карту cookie-name => path-regexp для контроля доступа
3. Обспечивать отдачу plain файла и если его нет, запрашивать основной сервер на выкладывание этого файла
4. Поддерживать какой-то режим отадачи еще не кешированных данных (ожидание, отдача plain файла с контролем длины, туннелирование прям из java сервера)

Но таких _готовых_ решений я тоже не видел. (ну если не считать mod_plsql )
Re[2]: Изобретение велосипеда? (кеширование blob в фс)
От: StringWriter Россия  
Дата: 17.05.07 10:07
Оценка:
Вот еще подборка вариантов на тему

http://java-source.net/open-source/cache-solutions

ЗЫ: сори, забыл зарегаться, не могу добавить к предыдущему посту
Re: Изобретение велосипеда? (кеширование blob в фс)
От: lexius www.acula.org
Дата: 17.05.07 11:51
Оценка:
В свое время занимался похожей проблемой. Решил использовать ehcache для кеширования. Проверял и ложил в кеш после проверки прав. Так я кешировал аватары пользователей, кот. хранились в БД + пересжатые под другие размеры тоже кешировал.
************
www.acula.org
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.