ru_java, posts by tag: hibernate - LiveJournal (original) (raw)
Как сделать неблокирующую загрузку из базы?
На всякий случай опишу текущую ситуацию:
Есть web сервер, сделанный из Tomcat+Tapestry+Hibernate+Postgresql+еще всякое до кучи.
И вот приходит пользователь и говорит: отдай мне страничку.
А чтобы страничку нарисовать, надо слазить за данными в postgres и еще другие удаленные места.
Допустим, для страницы нужны данные d1, d2, d3 из внешних источников s1, s2, s3 (один из которых postgres)
Как это выглядит с точки зрения потоков:
Для обработки пользовательского запроса tomcat достает из пула рабочий поток и говорит ему: нарисуй html. Рабочий поток последовательными блокирующими запросами лезет за данными в s1, s2, s3 и рисует html.
Итого получается, что общая задержка на извлечение данных суммируется: t1+t2+t3.
Хочется запросить данные параллельно неблокирующими запросами. То есть сказать что то типа: источник, вот тебе запрос на эти данные. Но ты пожалуйста мой поток не блокируй и верни сразу же управление. А когда данные приедут, кинь мне какой-нибудь event или дерни мой callback.
Тогда бы я одновременно сделал запросы в s1, s2, s3 и спокойно ждал, пока они все не приедут. Задержка бы получилась не сумма, а max( t1, t2, t3)
С прочими внешними источниками так договориться можно, а вот можно ли так договориться с Hibernate?
Ну или если Hibernate так не умеет, может есть что-то аналогичное, что умеет?
Хайбернейт: про борьбу с lazy exception in hibernate no Session и nested transactions not supported
July 5th, 2013
Приветы.
Имеемс обычную слоеную структурку в веб-приложении на основе Vaadin 6.8 : домен/ДАО (интерфейс и имлементация)/сервисы (интерфейс и имлементация). В качестве ОРМ взят Хайбернейт (4.2.х релиз). Никакого Спринга али JEE нет.
На ДАО уровне говоримс с БД посредством хиберной сессии. Хиберная сессия берется из фабрики сессии, которая сидит как приватная статич. переменная
На уровне сервиса реализована как бизнес-логика так и управление транзакциями
В настоящее время пытаюсь победить проблемки а-ля lazy exception in hibernate no Session и nested transactions not supported.
( О борьбе на упрощенном примере:..Collapse )
( По следам советов:Collapse )
Использование ORM (Hibernate) для актуализации с.хемы БД у заказчика
April 22nd, 2013
В поисках осовременненого подхода для актуализации с.хемы БД у заказчика заметил решение на основе ORM (Hibernate): "Hibernate: hbm2ddl.auto=update in production?" По ссыли народ в основом ругатеццо на такой простой подход Цитатами с книги жизни "Java Persistence with Hibernate":мотивирует
WARNING: We've seen Hibernate users trying to use SchemaUpdate to update the schema of a production database automatically. This can quickly end in disaster and won't be allowed by your DBA.
или злыми админами. С другой же стороны, коль юзают этот Hibernate, почему бы фишку это не поюзать то? Конечно, не сразу автоматом клиенту апдейты делать без бэкапа то. Вначале в режиме проверки на предмет изменений стартануть, а уж потом, когда резревная копия сделана базы, запускать bm2ddl.auto=update
Вопрос по hibernate: к сделать временные таблицы видимыми в нескольких native query?
April 11th, 2013
Добрый день! Есть вопрос, на который не нашёл ответа в Гугле, прошу подсказать уважаемое сообщества.
Допустим у нас есть метод getItems. Чтобы получить items из базы данных составлен сложный SQL запрос содержащий вложенные подзапросы. Поскольку оптимизатор базы данных MSSQL сам не догадался, один запрос был разделён на несколько с использованием временных таблиц.
Получается такой метод:
public Set
getItems {
//создаём временную таблицу
Query preQuery= entityManager.createNativeQuery("CREATE TABLE #SUBTABLE");
preQuery.executeUpdate();
//заполняем её данными
preQuery= entityManager.createNativeQuery("INSERT INTO #SUBTABLE SELECT fields FROM source_tables");
preQuery.executeUpdate();
Query query = entityManager.createNativeQuery("SELECT item FROM other_source_tables LEFT JOIN #SUBTABLE WHERE some_conditions");
List objLst = query.getResultList();
...
return items;
}
так вот, на втором запросе был получен exception, "Invalid object name #SUBTABLE". Хорошо, можно записать оба запроса в один createNativeQuery через точку с запятой. Сработало. А вот третий запрос - SELECT - записать в этот же createNativeQuery можно, но выскакивает exception, что ResultList уже не возвращается.
Временные таблицы существуют внутри одной сессии базы данных. Как заставить её продлиться между вызовами createNativeQuery? Я пробовал повесить @Transactional(propagation=Propagation.REQUIRED), но не помогло. Буду благодарен за советы и подсказки.
Видео материалы Юрия Ткача:JAVA для тестировщиков, JEE технологии...
December 29th, 2011
На minus.com залиты видео материалы Юрия Ткача:
1. JAVA для тестировщиков - видео курс уже есть в ютубе и на торренте, залитое было выпилено с ютуба. ( Аннотация Юрия ТкачаCollapse )
( дальше...Collapse )
2. JEE Технологии проектирования программных систем
которые также есть в ютубе . Аннотация
( Юрия ТкачаCollapse )
Примечание по**( поводу отсутсвия 1х 4х лекцийCollapse )**
September 15th, 2011
Существуют такие в природе, вообще? Не говоря уже о совместимости с hibernate. Нужна система, которая сама будет анализировать на основе выданной ей памяти, какие объекты и как кешировать. Не нужно мега ИИ, но хотя бы на простейшем уровне, для обычного веб-проекта. Задолбался просто с этим EhCache вводить значения от балды.
April 21st, 2011
Есть такой Hibernate конфиг.
@Embeddable class Foo { @Column String firstName; @Column String lastName; }
@Entity class Bar { @Id Long id;
@Embedded
@AttributeOverrides( {
@AttributeOverride(name="firstName", column = @Column(name="first_name") ),
@AttributeOverride(name="lastName", ??? )
} )
Foo foo;
}
Как сделать Bar::lastName – @Transient?
Подобное обсуждение: Embedded, AttributeOverrides and Transient properties
February 9th, 2011
вопрос по хибернейту, а точнее по связи many-to-one и леннивой загрузкой
Итак, имеем некое дерево в котором каждая нода имеет set описвающий ее чайлдов и связь many-to-one для обьекта-родителя. Для many-to-one прописано lazy="proxy" (и еще not-found="ignore"), но при получении нод из БД, отдельнми селектами извлекаются все родители. Но ведь я указал lazy="proxy" что вполне логично должно приводить к ленивой загрузке, не так ли? в нете нашол кучу похожих вопросов на форумах но ни одного решение, также бага в 3.0. У нас используется 3.2 в которой уже должно пофиксано
Подскажите, пожалуйста, как заставить хибернейт получать родителей все таки по запросу, а не сразу?
Spring data binding & Hibernate. Помогите разобраться.
December 13th, 2010
Команда в себе содержит некий entity object который отрисовывается на экране. Entity загружается через Hiberante и содержит в себе другие объекты.
Когда entity загрузилась некоторые вложенные объекты могут быть пустые т.е null
т.е.
Entity Foo:
String name="test"
Date date="13-12-2010"
Bar = null
На странице есть такие поля: Foo.name, Foo.date и Foo.Bar.number
Когда Spring байндит данные, то он чтобы дойти до значения number создаёт объект Bar
После этого, когда я нажимаю сабмит, я пытаюсь сохранить эту команду. Но в команде уже Bar != null и вылетает org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing
В проекте сейчас используется своя реализация DataBinder, которая зануляет такие объекты как Bar и всё нормально работает.
Но такой подходит выглядит как то ненормально.
Собственно вопрос как надо правильно делать? Как сохранить такую команду?