Java学习笔记(六十五)—— JDBC(数据库连接池)

数据连接池
  • 概念:是一个容器(集合),存放数库连接对象的容器。

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

    • 节约资源
    • 用户访问高效
  • 实现

    • 标准接口
    // 标准接口,javax.sql 包下
    public interface DataSource extends CommonDataSource, Wrapper
    	一个连接到这个DataSource对象所代表的物理数据源的工厂。
    	DataSource接口由驱动程序供应商实现。 有三种类型的实现: 
    		* 基本实现 - 生成标准的Connection对象 
    		* 连接池实现 - 生成将自动参与连接池的Connection对象。 此实现与中间层连接池管理器配合使用。 
    		* 分布式事务实现 - 生成可用于分布式事务的Connection对象,并且几乎总是参与连接池。 此实现与中间层事务管理器一起工作,并且几乎总是使用连接池管理器。
    	方法:
    		* Connection getConnection​() 
    			尝试建立与此 DataSource对象所代表的数据源的连接。
    		* 如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,不再关闭连接,而是还连接	
    • 数据库连接池技术
      • C3P0:
      • Druid:由阿里巴巴提供的
  • C3P0

    • 步骤:
    1. 导入jar包 c3p0-0.9.5.2.jarmchange-commons-java-0.2.12.jar,不要忘记导入数据库的驱动jar
    2. 定义配置文件
      2.1 名称:c3p0.properties 或者c3p0-config.xml
      2.2 路径:直接将文件放在 src 目录下即可
    <?xml version="1.0" encoding="utf-8"?>
    <c3p0-config>
      <default-config>
        <!--连接参数-->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</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="otherc3p0"> 
      	<!--连接参数-->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!--连接池参数-->
        <!--初始化申请的连接数-->
        <property name="initialPoolSize">5</property>
        <!--最大的连接数量-->
        <property name="maxPoolSize">8</property>
        <!--超时时间-->
        <property name="checkoutTimeout">3000</property>
      </named-config>
    </c3p0-config>
    1. 创建核心对象:数据库连接池对象 ComboDooledDataSource
    2. 获取连接:getConnection
    	// c3p0实现演示
        // 1.创建数据连接池对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        // 2.获取连接对象
        Connection connection = comboPooledDataSource.getConnection();
        // 3.打印
        System.out.println(connection);
           // c3p0 配置文件演示
            // 1.获取DataSource,使用指定名称的配置
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("otherc3p0");
            // 2.获取连接
            for (int i = 0; i < 8; i++) {
                try {
                    Connection connection = comboPooledDataSource.getConnection();
                    System.out.println(i+":="+connection);
                    if(i==4){
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
  • druid

    • 步骤
    1. 导入jar包 druid-1.0.9.jar
    2. 定义配置文件
      2.1 是properties形式
      2.2 可以叫任意名称,可以放在任意目录
    # 
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db2
    username=root
    password=root
    # 初始化的连接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000
    1. 加载配置文件
    2. 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
    3. 获取连接:getConnection
           // druid演示
            // 1.导入druid的jar包与数据库的驱动jar包
            // 2.定义配置文件
            // 3.加载配置文件
            Properties properties = new Properties();
            ClassLoader classLoader = DruidDemo1.class.getClassLoader();
            InputStream resourceAsStream = classLoader.getResourceAsStream("druid.properties");
            properties.load(resourceAsStream);
    
            // 4.获取连接池对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            // 5.获取连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
    • 定义工具类
      • 定义一个类JDBCUtils
      • 提供静态代码块加载配置文件,初始化连接池
      • 提供方法
        • 获取连接方法:通过数据库连接池
        • 释放资源
        • 获取连接池的方法
    // 定义JDBCUtils工具类
    public class JDBCUtils {
        // 1.定义成员变量 DataSource
        private static DataSource ds;
        static {
            try {
                // 1.加载配置文件
                Properties properties = new Properties();
                properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                // 2.获取DataSource
                ds = DruidDataSourceFactory.createDataSource(properties);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 获取连接的方法
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
        // 释放资源的方法
        public static void close(Statement stmt,Connection con){
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(con!=null){
                try {
                    con.close(); // 归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        public static void close(ResultSet rs,Statement stmt, Connection con){
            if(rs!=null){
                try {
                    rs.close(); // 归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            close(stmt,con);
        }
        // 获取连接池的方法
        public static DataSource getDataSource(){
            return ds;
        }
    }
            // 使用新的工具类
            // 给account表添加一条记录
            Connection connection=null;
            PreparedStatement preparedStatement=null;
            try {
                // 1.获取连接
                connection= JDBCUtils.getConnection();
                // 2.定义sql
                String sql="insert into account values(null,?,?)";
                // 3.获取PreparedStatement对象
                preparedStatement = connection.prepareStatement(sql);
                // 4.给?赋值
                preparedStatement.setString(1,"zhaoliu");
                preparedStatement.setDouble(2,5000);
                // 5.执行sql
                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                JDBCUtils.close(preparedStatement,connection);
            }
发布了113 篇原创文章 · 获赞 1 · 访问量 926

猜你喜欢

转载自blog.csdn.net/weixin_44876003/article/details/103442655