Spring Boot 1.2.5,Oracle 和 Hibernate 连接池

Spring Boot 1.2.5, Oracle and Hibernate connection pooling

我正在分析我的 Spring Boot 1.2.5 应用程序,发现性能很差。在负载相对较轻的情况下,提供一个简单的登录页面需要 4 秒以上(此时,JMeter 具有 500 个模拟用户)。

我正在使用 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 依赖项在我的 pom 中看起来像这样:

    <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 属性,那么连接池应该处于活动状态。

不过,我不确定是不是。当我启动 Spring 引导时,我看到的一些消息是:

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.

中找到了属性

我想知道,我是不是做错了什么,有没有办法验证连接池是否真的处于活动状态?

非常感谢...

在 Steve Waldman 的有益评论下,我完成了这项工作。对于任何感兴趣的人,由于我使用的是 Spring Boot 1.2.5.RELEASE,它基于 Spring 4.1.7.RELEASE,Hibernate 5 并不容易获得(尽管我致力于此)。

因此,要使其正常工作,请将其放入 pom:

<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

如果您愿意,可以将属性放入 hibernate.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

它对我的问题有帮助,尽管没有我希望的那么大。