• 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 ~ 

    每天都要遇到更好的自己.
  • 相关阅读:
    软件测试重点
    微端 代码project as air 分享
    分析三层架构
    mini2440裸试验—计算器(LCD显示,触摸屏突破)
    ThreadSafeClientConnManager的20个例子
    HttpClient 网络优化
    maven仓库总结,maven私服搭建,批量mvn eclipse:eclipse
    ThreadSafeClientConnManager用来支持多线程的使用http client
    HttpClient 4.3教程(转载)
    一个简单的HTTP服务器(多线程)
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/11865070.html
Copyright © 2020-2023  润新知