spring 整合c3p0連接池

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/qq_37933685/article/details/81747281

個人博客:https://suveng.github.io/blog/​​​​​​​

Spring 整合C3P0連接池

注意:環境 jdk1.8 ,idea 2018,maven,spring環境 代碼存放在碼雲裏面。

碼雲地址

https://gitee.com/suwenguang

注意這個工程還有我其他demo,本文目錄在spring.my.suveng.jdbc.c3p0JDBC 目錄裏面 spring 配置再spring.config 目錄下

什麼是連接池?

連接池允許多個客戶端使用緩存起來的鏈接對象,這些對象是共享的,可重用的。

為什麼要連接池?

打開/關閉數據庫連接開銷很大,連接池技術允許我們在連接池裡維護連接對象,這樣可以提高數據庫的執行命令的性能

連接池運行原理

多個客戶端請求可以重複使用相同的連接對象,當每次收到一個客戶端請求時,就會搜索連接池,看看有沒有閑置的連接對象。如果沒有閑置對象的話,要麼所有的客戶端請求都進入隊列排隊,要麼在池中創建一個新的連接對象(這取決於池裡已經有多少個連接存在以及配置支持多少連接)。一旦某個請求使用完連接對象之後,這個對象會被重新放入池中,然後會被重新分派給排隊等待的請求(分派給哪個請求要看使用什麼調度算法) 。

因為大部分請求都是使用現存的連接對象,所以連接池技術大大減少了等待創建數據庫連接的時間,從而減少了平均連接時間

spring整合c3p0連接池

  1. 導入jar包:c3p0 (使用maven導入依賴,只是部分pom.xml) <!–c3p0 連接池–> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId> <version>0.2.11</version> </dependency> <!–end–>
  2. 配置c3p0數據源。(這裡並沒有整合 mybatis的框架,使用的是spring JDBC)
<?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xmlns:context="http://www.springframework.org/schema/context"         xmlns:aop="http://www.springframework.org/schema/aop"         xmlns:tx="http://www.springframework.org/schema/tx"         xsi:schemaLocation="http://www.springframework.org/schema/beans          http://www.springframework.org/schema/beans/spring-beans.xsd          http://www.springframework.org/schema/context          http://www.springframework.org/schema/context/spring-context.xsd          http://www.springframework.org/schema/aop          http://www.springframework.org/schema/aop/spring-aop.xsd          http://www.springframework.org/schema/tx          http://www.springframework.org/schema/aop/spring-tx.xsd">        <context:component-scan base-package="spring.my.suveng"/>        <!--使用註解配置aop 需要開啟 切面自動代理-->      <aop:aspectj-autoproxy/>      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">          <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>          <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/suveng?serverTimezone=Asia/Shanghai &amp;characterEncoding=utf8"/>          <property name="user" value="root"/>          <property name="password" value="root"/>      </bean>        <!--配置jdbcTemplate-->      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">          <property name="dataSource" ref="dataSource"/>      </bean>  </beans>

測試

/**   * author Veng Su   * email [email protected]   * date 2018/8/16 18:56   */  @RunWith(SpringJUnit4ClassRunner.class)  @ContextConfiguration("classpath:spring/my/suveng/jdbc/c3p0JDBC/spring_config/spring_c3p0.xml")  public class C3p0Test {      @Resource      JdbcTemplate jdbcTemplate;        @Test      public void testC3p0() {          // 查詢一條數據          User user1 = jdbcTemplate.queryForObject("select * from user where id = ?", new C3p0Test.BeanMapper(), 1);          System.out.println(user1);            // 刪除  //         jdbcTemplate.update("delete from user where id = ?", 1);            // 修改          jdbcTemplate.update("update user set name = ? where id = ?", "春花", 1);            // 插入          jdbcTemplate.update("insert into user(name,age) values( ?, ?)", "花花", 1000);            // 方式2:查詢所有的數據          List<User> list2 = jdbcTemplate.query("select * from user", new C3p0Test.BeanMapper());            for (User user : list2) {              System.out.println(user);          }          // 方式1: 查詢所有的數據          List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");          for (Map<String, Object> map : list) {              //  map.keySet() 用於獲取所有的 key              for (String key : map.keySet()) {                  // 通過 key 獲取到對應的 value 值                  System.out.print(map.get(key));              }              // 相當於換行效果              System.out.println();          }      }      private class BeanMapper implements org.springframework.jdbc.core.RowMapper<User> {          // 查詢的時候,有可能會返回多個數據,所有的數據都會放在 rs 結果集中          // rounum 代表的是記錄的下表值          public User mapRow(ResultSet resultSet, int i) throws SQLException {              User user=new User();              user.setId(resultSet.getInt("id"));              user.setName(resultSet.getString("name"));              user.setAge(resultSet.getInt("age"));              return user;          }      }    }

運行結果

使用spring JDBC 進行操作。數據源配置其實是很簡單的。到這裡配置完成,連接池還有其他配置可以選擇。加油。