【问题标题】:In Spring Boot, using c3p0 simultaneously with jdbcTemplate and Hibernate在 Spring Boot 中,同时使用 c3p0 与 jdbcTemplate 和 Hibernate
【发布时间】:2016-05-20 01:10:07
【问题描述】:

我有一个 SpringBoot 应用程序(Java 8 上的 1.3.2.RELEASE),它通过 JDBC 对 Oracle JDBC 驱动程序 12.1.0.1 使用 Hibernate 4.3.11.Final 和 SQL 调用。它也使用hibernate-c3p0 4.3.11.Final。 JDBC 调用是针对自动装配的 JdbcTemplate 实例进行的。

在我的 pom 中,我还依赖于 Oracle UCP 和 ONS。以下是相关的 pom 条目:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ucp</artifactId>
        <version>12.1.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ons</artifactId>
        <version>12.1.0.2</version>
    </dependency>

但是,我找不到 Oracle UCP 的配置。此外,c3p0 的所有配置似乎只适用于 Hibernate。

以下是相关的 application.properties 文件条目(没有其他属性文件):

# Properties for Hibernate and Oracle
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.properties.hibernate.connection.driver_class = oracle.jdbc.driver.OracleDriver

spring.datasource.url=jdbc:oracle:thin:@my-db-server:1523:me
spring.datasource.username=myuser
spring.datasource.password=mypass


# Configure the C3P0 database connection pooling module
spring.jpa.properties.hibernate.c3p0.max_size = 15
spring.jpa.properties.hibernate.c3p0.min_size = 6
spring.jpa.properties.hibernate.c3p0.timeout = 2500
spring.jpa.properties.hibernate.c3p0.max_statements_per_connection = 10
spring.jpa.properties.hibernate.c3p0.idle_test_period = 3000
spring.jpa.properties.hibernate.c3p0.acquire_increment = 3
spring.jpa.properties.hibernate.c3p0.validate = false
spring.jpa.properties.hibernate.c3p0.numHelperThreads = 15

spring.jpa.properties.hibernate.connection.provider_class = org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

spring.jpa.properties.hibernate.connection.url=jdbc:oracle:thin:@sea-db-server:1523:me
spring.jpa.properties.hibernate.connection.username=myuser
spring.jpa.properties.hibernate.connection.password=mypass

我想弄清楚的是,针对 spring autowired JdbcTemplate 进行的 JDBC 调用是否正在使用 c3p0 连接池,以及 Oracle UCP 是否正在做任何事情,因为它似乎没有配置.

我真的需要 JDBC 调用的连接池。现在,我遇到了与 Oracle 的连接关闭的问题。我们没有使用 Oracle RAC,所以我不需要 UCP,因此可以只使用 c3p0。

如果有人可以帮助我了解现在正在发生的事情,或者告诉我要检查什么,我将不胜感激。另外,假设我是对的并且 JDBC 调用没有使用池,那么解决这个问题的最佳方法是什么?

更新

根据下面的答案和 cmets,我决定删除 c3p0 并使用 Spring 原生支持的池。因此,我将从 pom 中提取 c3p0(以及 oracle ucp 和 ons),并在 application.properties 文件中包含以下内容。

我正在尝试确保 (1) 我有一个连接池,如果连接丢失,我将管理与数据库的重新连接,以及 (2) JDBC 和 Hibernate 使用相同的数据源。

我做对了吗?

spring.datasource.url=jdbc:oracle:thin:@db-server:1523:mysvc
spring.datasource.username=myuser
spring.datasource.password=mypass

spring.datasource.max-active=50
spring.datasource.initial-size=5
spring.datasource.max-idle=10
spring.datasource.min-idle=5
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1 FROM DUAL
spring.datasource.time-between-eviction-runs-millis=5000
spring.datasource.min-evictable-idle-time-millis=60000

【问题讨论】:

    标签: hibernate jdbc spring-boot c3p0


    【解决方案1】:

    (1)UCP Configuration with Spring。参考博客

    (2) 公共 maven 存储库中不存在 Oracle JDBC 驱动程序。因此,您需要从OTN 页面手动下载 JDBC 驱动程序 如下图安装。

    mvn install:install-file \ -Dfile=/lib/ojdbc7.jar \ -DgroupId=com.oracle \ -DartifactId=ojdbc7 \ -Dversion=12.1.0.1 \ -Dpackaging=jar \ -DgeneratePom=true

    【讨论】:

      【解决方案2】:

      您似乎正在尝试通过 Hibernate 创建连接池。 Spring Boot 自动创建一个绑定到 Hibernate 的 DataSource,但您的配置(spring.jpa.properties.hibernate.spring.jpa.properties.hibernate.connection.url)正在创建另一个数据源!

      如果您依赖自动配置的 JdbcTemplate,则不应要求 hibernate 创建 DataSource(我们没有理由重复使用它)。我不知道该特定功能,但我会执行以下操作:

      1. 删除所有spring.jpa.properties.hibernate.c3p0spring.jpa.properties.hibernate.connection.url
      2. 依靠 Spring Boot 创建DataSource。我们不支持 c3p0(也许我们应该?)。如果你想使用它,你可以创建自己的
      3. 删除所有方言内容,无论如何我们都会自动为您检测

      这是创建DataSource并将其绑定到环境的简单方法

      @Bean
      @ConfigurationProperties("yourapp.datasource")
      public ComboPooledDataSource dataSource() {
          return new ComboPooledDataSource();
      }
      

      然后在你的配置中你可以添加类似的东西

      yourapp.datasource.driver-class=oracle.jdbc.driver.OracleDriver
      yourapp.datasource.jdbc-url=jdbc:oracle:thin:@sea-db-server:1523:me
      ...
      yourapp.datasource.min-pool-size=6
      yourapp.datasource.max-pool-size=15
      ...
      

      【讨论】:

      • 非常感谢!我现在尝试一下,但是它使用的是哪个连接池,它会直接为 Hibernate 和 JDBC 连接池吗?
      • 看到这里,我有点糊涂了,好像 ComboPooledDataSource 是一个 c3p0 类,但我以为你是说我应该把 c3p0 拉出来,因为它不受支持?
      • 我们不会自动配置它,但是如果您自己配置它,您可以完美地使用您想要的任何连接池。如果您不关心 c3p0,请使用我们支持的任何连接池和 spring.datasource 命名空间。在这种情况下,您甚至不需要编写任何代码(只需进行配置调整)
      • c3p0 _____IS___ 一个连接池,所以我不确定我是否理解这个问题。我回答的重点是确保 Hibernate 和 JdbcTemplate 使用相同的数据源。你的描述不是这样的。
      • 感谢 Stephane,这就是我想要实现的目标(Hibernate 和 JDBC 使用相同的数据源)。我做了一些阅读,现在明白你提供的代码是为了让我可以使用 c3p0。我不关心专门使用 c3p0,所以我想我会删除它并尝试使用您本机支持的池。我将编辑我的问题以添加我想出的内容,我认为我做得对,但我不确定。
      猜你喜欢
      • 2017-07-30
      • 2019-11-14
      • 2012-06-30
      • 2013-03-06
      • 2018-12-04
      • 2018-04-16
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多