2015-10-28 4 views
3

Я профилирую приложение Spring Boot 1.2.5 и считаю, что производительность довольно плохая. Обслуживание простой страницы входа занимает более 4 секунд под то, что будет относительно легкой нагрузкой (на данный момент JMeter с 500 имитируемыми пользователями).Spring Boot 1.2.5, Объединение соединений Oracle и Hibernate

Я использую VisualVM, чтобы попытаться профилировать его. Кажется, что 49% время приложений тратятся получение соединения с Hibernate:

org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection() 49.121124 4,450,911 ms (49.1%) 0.000 ms 4,573,860 ms 122,949 ms 

Чтобы смягчить это я пытаюсь включить пул соединений, но не кажется, что это будет работать. У меня есть:

Добавлен C3P0 моих зависимости, так что мои Hibernate зависимостей выглядеть в моем П:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.3.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>4.2.3.Final</version> 
    </dependency> 

Кроме того, в моем файле application.properties, я добавил:

spring.jpa.properties.hibernate.c3p0.min_size = 50 
spring.jpa.properties.hibernate.c3p0.timeout = 300 

В документах я прочитал, что если у меня есть какое-либо свойство Hibernate C3P0, пул соединений должен быть активным.

Однако я не уверен, что это так. Когда я начинаю Весна Ботинок, некоторые из сообщений, которые я вижу, являются:

2015-10-28 04:26:23.426 INFO 2182 --- [   main] org.hibernate.Version     : HHH000412: Hibernate Core {4.3.3.Final} 
2015-10-28 04:26:23.429 INFO 2182 --- [   main] org.hibernate.cfg.Environment   : HHH000206: hibernate.properties not found 
2015-10-28 04:26:23.431 INFO 2182 --- [   main] org.hibernate.cfg.Environment   : HHH000021: Bytecode provider name : javassist 
2015-10-28 04:26:23.756 INFO 2182 --- [   main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {4.0.5.Final} 
2015-10-28 04:26:24.207 INFO 2182 --- [   main] org.hibernate.dialect.Dialect   : HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect 

В «hibernate.properties» не нашел это один я обеспокоен. Я понимаю, что это может излучать это сообщение, даже если оно находит свойства в application.properties.

Мне интересно, я сделал что-то неправильно и есть ли способ проверить, действительно ли пул соединений активен?

Большое спасибо ...

+0

Я не думаю, что вы сделали что-нибудь, что на самом деле позволило бы c3p0. В зависимости от вашей установки вам может потребоваться заменить компонент Spring, который является источником данных вашего приложения (в c3p0 'ComboPooledDataSource'), или установить конфигурацию класса провайдера соединения hibernate param' connection.provider_class' в 'org.hibernate.connection.C3P0ConnectionProvider'. Если c3p0 настроен, библиотека будет регистрировать баннер и сообщение с длинным пулом в INFO при инициализации пула. –

+0

Спасибо Стив, но я не полностью следую. Вы говорите, что я могу сделать это с помощью еще одной записи о собственности? В настоящее время это Spring 4.2, и все настроено с аннотациями; нет xml. Я @Autowired JdbcTemplate и не предоставлял свой собственный источник данных.Если мне это нужно, я просто не понимаю, как это сделать. –

+0

Итак, я просто не очень разбираюсь в весенних сапогах. Но, судя по чистому угадыванию, я попробую 'spring.jpa.properties.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider'. Опять же, вы должны увидеть запуск c3p0 в своих журналах, если вы разрешаете произвольные сообщения через INFO. (в противном случае вам может потребоваться настроить логгеров с префиксом 'com.mchange' libs для входа в INFO через любую используемую библиотеку журналов.) –

ответ

2

с полезными комментариями Стива Вальдман, я получил эту работу. Для всех, кто интересуется, поскольку я использую Spring Boot 1.2.5.RELEASE, основанный на Spring 4.1.7.RELEASE, Hibernate 5 недоступен (хотя я над этим работаю).

Итак, чтобы сделать эту работу, поставить это в ПОМ:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>4.3.3.Final</version> 
</dependency>   
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-c3p0</artifactId> 
    <version>4.3.11.Final</version> 
</dependency> 

Эти свойства затем работать с application.properties:

spring.jpa.properties.hibernate.c3p0.max_size 2000 
spring.jpa.properties.hibernate.c3p0.min_size 100 
spring.jpa.properties.hibernate.c3p0.timeout 5000 
spring.jpa.properties.hibernate.c3p0.max_statements 1000 
spring.jpa.properties.hibernate.c3p0.idle_test_period 3000 
spring.jpa.properties.hibernate.c3p0.acquire_increment 2 
spring.jpa.properties.hibernate.c3p0.validate false 

spring.jpa.properties.hibernate.connection.provider_class = org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider 
spring.jpa.properties.hibernate.connection.url=jdbc:oracle:thin:@earth-db-11.mit.edu:1521:stardev 

spring.jpa.properties.hibernate.connection.username=yourun 
spring.jpa.properties.hibernate.connection.password=yourpw 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect 

Если вы предпочитаете, свойства могут перейти в спящий режим .properties, и они немного разные, например:

hibernate.c3p0.max_size 2000 
hibernate.c3p0.min_size 100 
hibernate.c3p0.timeout 5000 
hibernate.c3p0.max_statements 1000 
hibernate.c3p0.idle_test_period 3000 
hibernate.c3p0.acquire_increment 2 
hibernate.c3p0.validate false 

hibernate.connection.provider_class = org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider 
hibernate.connection.url=jdbc:oracle:thin:@earth-db-11.mit.edu:1521:stardev 

hibernate.connection.username=yourun 
hibernate.connection.password=yourpw 
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect 

Это помогло моей проблеме, хотя и не так сильно, как я надеялся.