Избегайте финализаторов. Нет никакой гарантии, что их назовут своевременно. Могло потребоваться довольно долгое время, прежде чем Система управления памятью (т.е. сборщик "мусора") решит собрать объект с финализатором.
Многие люди используют финализаторы, чтобы сделать вещи как близкие сокетные соединения или удалить временные файлы. Путем выполнения, таким образом, Вы делаете свое поведение приложения непредсказуемым и связанным с тем, когда JVM идет в GC Ваш объект. Это может привести к "из памяти" сценарии, не из-за "кучи" Java, исчерпываемой, а скорее из-за системы, исчерпывающей дескрипторы для конкретного ресурса.
Еще одна вещь иметь в виду состоит в том, что представление вызовов к System.gc () или такие молотки может показать хорошие результаты в Вашей среде, но они не обязательно переведут в другие системы. Не все выполняют ту же JVM, существуют многие, SUN, IBM J9, BEA JRockit, Гармония, OpenJDK, и т.д. Эта JVM, которой все приспосабливают JCK (те, которые были официально протестированы, который), но имеет большую свободу когда дело доходит до создания вещей быстро. GC является одной из тех областей, в которые все вкладывают капитал в большой степени. Используя молоток часто будет времена уничтожать то усилие.
Вы упоминаете Entity Framework как часть «контра» для параметра Linq to SQL, но вам следует рассмотреть его вместо Linq to SQL - он обеспечивает почти такую же функциональность плюс Больше. Для проектов с небольшими базами данных это определенно дает большую отдачу. В EF может быть сложно управлять контекстом для больших баз данных, а изменения схемы могут привести к поломке, но эти проблемы возникают при любом подходе к доступу к данным.
На мой взгляд, самый большой недостаток EntLib заключается в том, что вы все еще катят ваши собственные объекты данных. Корпоративная библиотека избавляет от большого количества кода сантехники прямо "
А. Также проверьте NHibernate.
B. DataSet - самый быстрый и простой, но вы много программируете.
Все остальное - много хорошего в использовании инструментов ORM, но есть много проблем с их трехуровневым использованием.
(ленивая загрузка - это проблема, с которой нужно справиться, создание множества больших деревьев объектов, влияющих на производительность, кеширование не настолько умно, насколько это возможно)
Итак - это зависит от ваших основных потребностей и сколько времени вы хотите потратить на изучение EL / LINQ или NHibernate, прежде чем вы начнете кодировать, b / c есть кривая обучения с этими инструментами.
Раньше мы использовали DataSets с EntLib 4.1 Data Application Block.
Теперь мы используем Entity Framework. Мы добились значительного повышения производительности с Entity Framework по сравнению с EntLib 4.1. (Запрограммируйте уровень данных для 80 таблиц за 10 часов вместо 80)
Entity Framework 4 все еще находится в бета-версии, но если до запуска вашего проекта пройдет некоторое время, я бы выбрал EF 4. Вы получаете производительность как ORM в то же время гибкость использования POCO (Plain Old Clr Objects)
NHibernate имеет в целом лучший сочетание набора функций, зрелости и поддержки.
Лучшая идея - иметь возможность использовать обе технологии одновременно. Как это сделать? Это очень просто с шаблоном репозитория. Сначала вам нужно создать общий интерфейс IRepository. Что-то вроде этого:
public interface IERepository<E>
{
DbTransaction BeginTransaction();
void EndTransaction();
void Add(E entity);
void Delete(E entity);
int Save();
ObjectQuery<E> DoQuery(string entitySetName);
IList<E> SelectAll(string entitySetName);
E SelectByKey(int Key);
bool TrySameValueExist(string fieldName, object fieldValue, string key);
bool TryEntity(ISpecification<E> selectSpec);
int GetCount();
int GetCount(ISpecification<E> selectSpec);
int AddAndSave(E entity);
}
Я предпочитаю Entity Framework. На его основе создал 3 проекта. Работает очень быстро, особенно запросы с разбиением на страницы. Итак, после того, как вам нужно создать базовый универсальный класс Repository с виртуальными методами, которые реализуют интерфейс IRepository. И это все. Теперь у вас есть очень быстрый способ создать DAl, написав такой простой код:
public class MonthRepository:Repository<Month>
{
}
У вас есть возможность переопределить все методы базового класса и создать доступ к БД с помощью хранимой процедуры там, где вам нужно. И вы можете обойтись без изменения кода в других местах. Вы по-прежнему будете возвращать объекты того же типа, но получите их другим способом.
Прочтите подробнее на http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx