数据库连接池(c3p0&&druid&&Druid工具类)

数据库连接池(c3p0&&druid&&Druid工具类)

注:本实验是在maven工程下配置pom.xml文件导入jar包

  1. 概念

数据库连接池:其实就是一个容器(集合),存放数据库连接的容器

当系统初始化好之后,容器就被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

  1. 好处
  • 节约资源
  • 用户访问更高效
  1. DataSource接口认知
  1. javax.sql.DataSource
  2. 该接口没有具体的实现类,而是在使用过程中由驱动程序供应商实现接口
DataSource 接口由驱动程序供应商实现。共有三种类型的实现
1.    基本实现 - 生成标准的 Connection 对象 
2.    连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。 
3.    分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。 
4.    接口的方法(获取连接)
 Connection getConnection() 
          尝试建立与此 DataSource 对象所表示的数据源的连接。 
 Connection getConnection(String username, String password) 
          尝试建立与此 DataSource 对象所表示的数据源的连接。 
5.    归还链接:如果连接对象connection是从连接池中获取的,那么调用Connection.close()方法,则不会关闭连接了,而是归还连接给连接池。
  1. C3P0数据库连接池技术
  1. 使用步骤:

    1. 导入c3p0依赖
    <dependencies>
            <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>mchange-commons-java</artifactId><!-- c3p0所依赖的jar包 -->
                <version>0.2.12</version>
            </dependency>
            <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId> <!-- 必要依赖 -->
                <version>0.9.5.2</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId> <!-- 必要依赖 -->
                <version>5.1.6</version>
                <scope>runtime</scope> <!-- 只在运行时生效 -->
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    </dependencies>
  1. 创建c3p0-config.xml配置文件

    注:c3p0-config.xml必须放在resources目录下,以遵循maven工程目录要求

    <c3p0-config>
        <!-- 使用默认的配置读取连接池对象 -->
        <default-config>
            <!--  连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property>
            <property name="user">root</property>
            <property name="password">root</property>

            <!-- 连接池参数 -->
            <property name="initialPoolSize">5</property><!-- 初始池中连接数量 -->
            <property name="maxPoolSize">10</property><!-- 最大连接数量,超过此数量会报错 -->
            <property name="checkoutTimeout">3000</property><!-- 超时时间 -->
        </default-config>

        <named-config name="anotherc3p0"><!-- 指定名称的配置,可以在DataSource中指定名称调用此配置,而不再使用默认配置 -->
            <!--  连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property>
            <property name="user">root</property>
            <property name="password">root</property>

            <!-- 连接池参数 -->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">8</property>
            <property name="checkoutTimeout">1000</property>
        </named-config>
    </c3p0-config>
  1. 使用C3P0连接池

    package zhi.itlearn;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    public class C3P0Utils {
       public static void main(String[] args) throws SQLException {
           //创建数据库连接池对象
           DataSource ds = new ComboPooledDataSource();
           //使用anotherc3p0连接池配置
           //DataSource ds2 = new ComboPooledDataSource("anotherc3p0");
           //获取连接对象
           Connection connection = ds.getConnection();
           //打印connection,测试是否有拿到连接对象
           System.out.println(connection);
       }
    }
  1. Durid数据库连接池技术

Durid:数据库连接池实现技术,由阿里巴巴提供

  1. 使用步骤
  • 导入jar包依赖
&lt;dependency&gt;
    &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
    &lt;artifactId&gt;druid&lt;/artifactId&gt;
    &lt;version&gt;1.2.4&lt;/version&gt;
&lt;/dependency&gt;
  • 定义配置文件(使用properties配置文件)

注意:properties配置文件可以是任意名称,不过需要放在resources文件夹下。

在此命名为:druid-config.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/xskc
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
  • 获取数据库连接池对象,获取Connection连接:通过DruidDataSourceFactory类
package zhi.itlearn;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class DuridDemo {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties pro = new Properties();
        //通过类加载器获取资源文件,并返回字节流
        InputStream asStream = DuridDemo.class.getClassLoader().getResourceAsStream("duril-config.properties");
        //加载字节流
        pro.load(asStream);
        //获取连接池对象:通过DruidDataSourceFactory类
        DataSource source = DruidDataSourceFactory.createDataSource(pro);
        //获取连接
        Connection connection = source.getConnection();
        System.out.println(connection);
    }
}
  1. 定义Druid工具类:JDBCUtils.class
package zhi.itlearn;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    private static DataSource ds;

    static {
        try {
            //加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("duril-config.properties"));
            //获得DataSource连接池对象
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static DataSource getDateSource(){
        return ds;
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    public static void close(Statement stat,Connection conn){
        close(null,stat,conn);
    }
    public static void close(ResultSet rs, Statement stat, Connection conn){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stat!=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close(); //归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}
  1. 测试JDBCUtils工具类
package zhi.itlearn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCUtilsTest {
    public static void main(String[] args) throws SQLException {
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT * FROM student WHERE sage = 19");
        ResultSet set = statement.executeQuery();
        while(set.next()){
            System.out.println(set.getString("sname"));
        }
        JDBCUtils.close(set,statement,connection);
    }
}

数据库连接池(c3p0&&druid&&Druid工具类)

上一篇:MySQL基础应用


下一篇:Java连接数据库技术--JDBC介绍