zoukankan      html  css  js  c++  java
  • JDBC 连接池

    连接池

    概念: 是一个装载数据连接的容器.

    当应用初始化好后, 容器被创建, 容器中会申请一些连接对象, 当用户来访问数据库时, 从容器中去拿连接对象, 用户访问完后, 会将连接对象归还给容器. (连接池)

    优点: 节约资源, 操作高效.

    实现:

    通过标准接口实现: DataSource (javax.sql 包下)

    一般不自己去写实现类, 有数据库厂商来做 (类似于 py 中的 DBUtils 中的 PooledDB 实现类)

    1. C3P0: 一种数据库连接池技术

    2. Druid: 数据库连接技术, 由阿里巴巴提供

     

    常用方法:

    1. getConnection(): 获取连接

    2. Connection.close(): 归还连接

      如果是连接对象 Connection 是从连接池中获取, 那么调用 close 方法是归还连接, 不是关闭.

    C3P0

    使用步骤:

    1. 导入 jar 包 (c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar)

      不要忘记导入数据库驱动包 (mysql驱动)

    2. 定义配置文件

      • 配置文件名称是固定的: c3p0.properties 或 c3p0-config.xml

      • 配置文件路径: 直接放 src 目录下即可

    3. 创建数据库连接池对象 ComboPooledDataSource

    4. 获取连接对象: getConnection()

    demo: 

    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    
    public class JdbcC3P0 {
        public static void main(String[] args) throws SQLException {
            // 创建数据连接池对象 (使用javax.sql 包下的DataSource 父类接口 指向子类引用, 多态写法)
            DataSource pool = new ComboPooledDataSource();
            Connection conn = pool.getConnection();
            // 打印连接对象
            // com.mchange.v2.c3p0.impl.NewProxyConnection@33e5ccce [wrapping: com.mysql.jdbc.JDBC4Connection@5a42bbf4]
            System.out.println(conn);
        }
    }

    配置文件: ( c3p0-config.xml )

    <c3p0-config>
      <!-- 使用默认的配置读取连接池对象 -->
      <default-config>
          <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://192.168.0.115:3306/JDBC</property>
        <property name="user">username</property>
        <property name="password">passwd</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/day25</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>

    Druid

    使用步骤:

    1. 导入 jar 包 druid-1.0.9.jar

    2. 定义配置文件

      • 是 properties 形式

      • 文件可以放在任意目录下, 通过路径加载配置文件

    3. 加载配置文件

    4. 获取数据库连接池对象: 通过工厂函数来获取: DruidDataSourceFactory.createDataSource()

    5. 获取连接 --> 获取执行对象 --> 处理结果集 --> 资源回收

    JDBCDruidUtils 工具类:

    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    
    /**
     * JDBCDruidUtils 工具类
     */
    public class JDBCDruidUtils {
        private static DataSource ds = null;
    
        static {
            try {
                // 加载配置文件
                Properties pro = new Properties();
                // 获取 src 路径下的文件 --> ClassLoader
                ClassLoader cl = JDBCDruidUtils.class.getClassLoader();
                InputStream is = cl.getResourceAsStream("druid.properties");
                pro.load(is);
                // 通过工厂函数 获取 数据库连接池 (传入配置文件)
                ds = DruidDataSourceFactory.createDataSource(pro);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 获取连接池对象
        public static DataSource getDataSource(){
            return ds;
        }
    
        // 获取连接对象
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    
        // 资源回收
        public static void close(ResultSet ret, PreparedStatement pstat, Connection conn){
            if (ret != null) {
                try {
                    ret.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if (pstat != null) {
                try {
                    ret.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if (conn != null) {
                try {
                    ret.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    配置文件: ( druid.properties )

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://192.168.0.115:3306/JDBC
    username=username
    password=passwd
    initialSize=5
    maxActive=10
    maxWait=3000

    demo: 

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    
    public class JdbcDruid {
        public static void main(String[] args) {
    
            Connection conn = null;
            PreparedStatement pstat = null;
            ResultSet ret = null;
    
            try {
                // 获取数据库连接
                conn = JDBCDruidUtils.getConnection();
                // 编写sql
                String sql = "select * from user where username = ?;";
                // 获取执行 sql 对象
                pstat = conn.prepareStatement(sql);
                // 给 sql 赋值
                pstat.setString(1, "xiaoming");
                // 执行sql
                ret = pstat.executeQuery();
                // 读取一条记录
                ret.next();
                // 处理结果 ResultSet
                String passwd = ret.getString("passwd");
                System.out.println(passwd);  // 123
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCDruidUtils.close(ret, pstat, conn);
            }
        }
    }

    ending ~ 

    每天都要遇到更好的自己.
  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/11865070.html
Copyright © 2011-2022 走看看