LINUX.ORG.RU

[java][Spring][pool] Кажется отключаются соединения

 , ,


0

0

У меня есть PU, который настроен следующим образом

<persistence-unit name="buses_EL" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <shared-cache-mode>ALL</shared-cache-mode>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/buses_db"/>
      <property name="javax.persistence.jdbc.password" value="***"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="***"/>
	  <property name="eclipselink.ddl-generation" value="create-tables"/>
	  <property name="eclipselink.target-database" value="MySQL"/>
      <property name="eclipselink.jdbc.connections.initial" value="5"/>
    <property name="eclipselink.jdbc.connections.min" value="5"/>
      <property name="eclipselink.jdbc.connections.max" value="50"/>
    </properties>
  </persistence-unit>

Первый запрос к БД идет очень долго. Понятное дело, лениво инициализируется pool. После этого все летает. Если оставить в покое на некоторое время, например часов на 5 и совсем не заходить на сайт, то процедура повторяется.

Подозрение: оно или отключается или просто выгружается из кеша. Такое поведение крайне нежелательно.

Как обычно вы делаете Connection pool? Может что-то можна сделать без больших изменений типо переписывания кода, какая нибудь опция?

★★★★★

это мускул со своей стороны закрывает соединения. соединения надо тестировать перед отдачей в аппс. этим должен заниматься пул. пул - задача контейнера, а не персистенц юнита. решение: персистенц юнит должен брать соединения через jndi. поэтому ответ на предпоследний вопрос - никак: берем из контейнера.

Pi ★★★★★
()
Ответ на: комментарий от Pi

Как то невнятно это все в Tomcat настраивается... Хотел как можно больше засунуть в приложение, чтобы потом не ковыряться в каждом сервере.

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

DBCP настраивается предельно просто. тут у тебя выбор: либо декларативно соединения настроить в томкате и так же декларативно их менять, либо о них забыть, либо свалить эту проблему на плечи админа или на каждый чих ребилдить war. лень подталкивает к первому варианту :)

Pi ★★★★★
()
Ответ на: комментарий от JFreeM

А на базе EclipseLink все таки никак? Почему EclipseLink отключает, а томкат не будет? Уже нервы сдаю, томкат - известный генератор ошибок и рекордсмен по неочевидным опциям конфигурации.

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

для томката я не знаю как конфигурить. Он вообще не jdbc-контейнер. Судя по всему там либу надо будет положить для container-award connection pooling.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

Теоретически я тоже знаю. Тут все упирается в конкретные ошибки в конфигах.

context.xml в моем WAR

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/bustrading">
     <ResourceLink
			global="jdbc/buses"
			name="jdbc/buses"
			type="javax.sql.DataSource"/>
   
</Context>

Я же так понимаю что не обязательно его ложить в server.xml, там ведь есть уже в GlobalNamingResources

    <Resource name="jdbc/buses" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="**" password="**"
               factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                  driverClassName="com.mysql.jdbc.Driver"
                  validationQuery="SELECT 1"
               url="jdbc:mysql://localhost:3306/buses_db"/>

А PU определяется так

 <persistence-unit name="buses_EL" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <non-jta-data-source>jdbc/buses</non-jta-data-source>
    <shared-cache-mode>ALL</shared-cache-mode>
    <properties>
     
      <property name="eclipselink.ddl-generation" value="create-tables"/>
      <property name="eclipselink.target-database" value="MySQL"/>
      <property name="eclipselink.jdbc.connections.initial" value="5"/>
      <property name="eclipselink.jdbc.connections.min" value="5"/>
      <property name="eclipselink.jdbc.connections.max" value="50"/>
    </properties>
  </persistence-unit>

В итоге

Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
        at org.apache.naming.NamingContext.lookup(Unknown Source)
        at org.apache.naming.NamingContext.lookup(Unknown Source)
vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Я настраиваю все через spring.

http://blog.springsource.com/2006/05/30/getting-started-with-jpa-in-spring-20/

Только dataSource не прямым текстом а через PropertyPlaceholderConfigurer (может брать настройки из нескольких источников). И в качестве реализации dataSource DBCP или c3po.

vorpal
()
Ответ на: комментарий от vertexua

Это к настройкам соответствующих пулов соединений. В com.mchange.v2.c3p0.ComboPooledDataSource есть test query.

vorpal
()

Не знаю из-за чего, или продиагностировал проблему неправильно, но сайт начал летать с

      <property name="eclipselink.jdbc.native-sql" value="true"/>
      <property name="eclipselink.jdbc.cache-statements" value="true"/>
vertexua ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.