2015-05-25 3 views
1

Как весна знает, какой пул подключений использовать?Как весна знает, какой пул подключений использовать?

Как известно, вы сообщаете весеннему фрейму имя единицы сохранения и аннотируете диспетчер объектов с помощью @ PersistenceContext и с настройкой Persistence.xml. Spring делает все для вас.

Я очень смущен про весеннюю аннотацию «@PersitenceContext» над полем entityManager. Мой persistence.xml, как показано ниже:

<persistence-unit name="hibernate.recommendation_report.jpa"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@192.168.113.226:11521:BOSS" /> 
     <property name="javax.persistence.jdbc.user" value="xxxx" /> 
     <property name="javax.persistence.jdbc.password" value="xxxx" /> 
    </properties> 
</persistence-unit> 

Мой кот сервер и мой веб-приложение работает хорошо, когда и после того, как в течение короткого peoriod времени после запуска из котом server.But часов, сервер сообщает SQLException Msgstr "Соединение уже закрыто".

Это проблема неправильного использования пула соединений db? Как Spring Framework выбирает c3p0 или DBCP? Как я могу указать пул соединений? Или Tomcat использует DBCP по умолчанию в качестве пула соединений?

+0

Какая весна имеет отношение к этому? Вы представляете блок персистентности, не использующий ЛЮБОЙ пул соединений, ЗА ИСКЛЮЧЕНИЕМ, ЧТО ИСПОЛЬЗУЕТСЯ ПРОВАЙДЕР JPA. Ваш поставщик JPA - это то, что создает пул –

+0

Не весенний поиск persistence.xml и инициализация источника данных для меня? Я думаю, что поставщик JPA просто управляет сущностями. Я блуждаю, если могу поместить некоторые теги/конфигурацию в файл persistence.xml указать пул соединений для используемой структуры. –

+0

Нет. Поставщик JPA ищет источник данных, потому что этот источник данных необходим для сохранения/запроса объектов. –

ответ

2

U может сделать ваш сервер tomcat или другой сервер приложений предоставленным источником данных JNDI. Таким образом, автономный пул подключений вашего сервера может заботиться о вашем соединении/сеансе базы данных. Tomcat в вашем случае, вы указываете JNDI источника данных в $ TOMCAT_HOME/CONF/context.xml или server.xml:

<Resource name="jdbc/sample" auth="Container" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    username=... 
    password=... 
    url=... 
    driverClassName=... 
/> 

атрибут типа говорит котом, который пул соединений для использования. По умолчанию tomcat6 использует DBCP с типа "java.sql.DataSource". Обязательно используйте ссылку JNDI в вашем persistence.xml:

<persistence version="2.1" ....> 
    <persistence-unit name="hibernate.recommendation_report.jpa"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>java:comp/env/jdbc/sample</non-jta-data-source> 
    </persistence-unit> 
</persistence> 

Или использовать родниковую XML для конфига источника данных боба, чтобы ввести в вашем entityManagerFactory.Please refer to here.

<jee:jndi-lookup id="dataSource" jndi-name="java:sample"/> 

Просмотреть другие ресурсы JNDI attributes available for DBCP. Примечание: префикс «java: comp/env /» в источнике данных persistence.xml очень импортен. При этом Spring не будет искать пул, предоставляемый вашим сервером приложений, для извлечения источника данных, но просто используйте этот атрибут для создания простой источник данных. Примечание: tomcat8 сам по себе обеспечивает еще лучший пул. Если вы обновляетесь до tomcat8.

+0

, за исключением того, что пользователь не указал источник данных JNDI. Он указал URL-адрес подключения и драйвер. Таким образом, ответственность несет поставщик JPA, как определено в спецификации JPA. –

+0

В случае только указания URL и драйвера и т. Д., Как поставщик JPA, например, спящий режим, управляет пулом соединений? Не могли бы вы показать какую-либо документацию у официального гибернатора? – happyyangyuan

+1

Я не использую Hibernate. Я использую DataNucleus JPA. Документация для пулов подключений показана на странице http://www.datanucleus.org/products/accessplatform_4_1/jpa/datastore_connection.html#Connection_Pooling Не может понять, почему другие не будут делать это точно так же ... i.e они создают DataSource для соответствующего пула и получают/закрывают соединения так же, как и в любом использовании JDBC. –

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