2015-02-17 4 views
3

я имею эту проблему: с Vaadin 7, я уже настроил мой persistence.xml, вот кодJPAContainer поддерживает подключение к базе открытого

<?xml version="1.0" encoding="UTF-8"?> 

http://java.sun.com/xml/ нс/сохранение/persistence_2_0.xsd» версия =„2,0“>

<persistence-unit name="xxxx"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
    <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://xxxxx;databaseName=xxxx;"/> 
    <property name="javax.persistence.jdbc.user" value="xxxx"/> 
    <property name="javax.persistence.jdbc.password" value="xxxx"/> 
    <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    <property name="hibernate.connection.release_mode" value="after_transaction" /> 
    </properties> 
</persistence-unit> 

Когда я создать новый JPAContainer и я привязать его к таблице, я вижу на MSSQL Activity Monitor мое новое соединение, но если m y сеанс отключен или вышел из системы, я все еще вижу соединение с SQL.

Если я перейду в приложение и обновляю таблицу, откроется новое соединение и т. Д.

Моя проблема заключается в том, что у меня есть тонны открытых соединений на моем сервере sql, которые никогда не закрываются.

Я пытался добавить свойство

<property name="hibernate.connection.release_mode" value="after_transaction" /> 

, но ничего не изменилось. Вы можете мне помочь? Что мне не хватает? Большое спасибо

ответ

3

Если у вас нет действительно серьезных причин, я бы действительно предложил взять современный Java EE-сервер и использовать предоставленную им JPA, управление транзакциями и объединение пулов. Определите соединение на сервере и используйте транзакции JTA (тэг jta-data-source в вашем файле persistence.xml). Другой вариант заключается в том, чтобы основать ваше приложение на Spring. Многие вещи могут пойти не так, если вы идете на «низкий уровень», как вы, кажется, делаете. Если вы уже знакомы с Hibernate, я бы выбрал Wildfly, поскольку у него есть Hibernate как его поставщик JPA.

Вместо JPAContainer лучше подключить ваш пользовательский интерфейс через фасад (EJB), и если вам нужен ленивый загруженный контейнер Vaadin, используйте, например, MTable от Viritin или Lazy Query Container. Это webinar и, например, этот example project может помочь вам приступить к работе.

Если у вас действительно нет решения, но для того, чтобы перейти с управлением сеансами управления JPA на низком уровне, вы должны убедиться, что вы правильно закрыли экземпляр EntityManager. Я бы создал вспомогательный метод для вашего интерфейса пользовательского интерфейса, который возвращает тот же EntityManager для каждого jpacontainer в вашем пользовательском интерфейсе. Затем добавьте DetachListener в свой пользовательский интерфейс и закройте диспетчер объектов.

+0

Спасибо за ваше время, Я никогда не работал на сервере JAVA EE, поэтому я стараюсь избегать его, потому что проект, над которым я работаю, только что начался, и мне нужно работать над тем, что я знаю. Возможно, я решил проблему: когда я обедаю свой пользовательский интерфейс, я устанавливаю соединения, используемые моими сессиями JPAC, и когда время сеанса отключается, я отключу все сеансы. Что вы думаете об этом решении? Я не могу поддержать ваш ответ, потому что у меня недостаточно репутации! : P – Leviand

+0

Многие люди избегают серверов Java EE по неверным причинам в наши дни. Они действительно легкие и делают ваши задачи проще, не сложнее. Весенний стек - еще один вариант, тогда вы можете пойти с простым комом или причалом. Я изменю свой ответ, чтобы покрыть «использование низкого уровня», хотя я все еще не предлагаю такую ​​архитектуру для кого-либо. – mstahv

+0

Еще раз спасибо! :) – Leviand

 Смежные вопросы

  • Нет связанных вопросов^_^