DBCP、c3p0、druid三种jdbc连接包的用法和注意事项等(你想懂的这里大概都有)

连接池jar包使用方式

一、DBCP连接池

1.1、介绍

  • DBCP连接池介绍

    	DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
    	单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
    

1.2、使用步骤

1.2.1、创建项目

1.2.2、导入相应的jar包(必做,1.3和1.4二选一)

  1. mysql-jdbc.jar
  2. commons-dbcp.jar
  3. commons-pool.jar

1.2.3、硬编码方式使用DBCP连接池(不使用配置文件,不推荐)

@Test
public void testHard() throws SQLException{
    //1.TODO 硬编码 使用DBCP连接池子
    BasicDataSource source = new BasicDataSource();
    //2.设置连接的信息
    source.setDriverClassName("com.mysql.jdbc.Driver");
    source.setUrl("jdbc:mysql://localhost:3306/day2");
    source.setUsername("root");
    source.setPassword("111");
    //3.获取连接
    Connection connection = source.getConnection();
    //4.执行sql语句
    String sql = "select * from student";
    Statement createStatement = connection.createStatement();
    ResultSet executeQuery = createStatement.executeQuery(sql);
    //5.获取结果
    while (executeQuery.next()) {
   		System.out.println(executeQuery.getString(2));
    }
    //6.关闭连接
    connection.close(); //回收
}

1.2.4、软编码方式使用DBCP连接池

  1. 项目中添加配置 --> info.properties

    • 文件名称:info.properties,其实无所谓,文件名随便起
    • 位置:info.properties在工具类的同级目录下同级目录下
  2. info.properties的文件内容

    #连接设置
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/day2
    username=root
    password=111
    #
    initialSize=10
    #最大连接数量
    maxActive=50
    #
    maxIdle=20
    #
    minIdle=5
    #
    maxWait=6000
    

1.2.5、java文件内容

@Test
public void testSoft() throws Exception{
    //1.TODO DBCP软编码连接池子使用
    BasicDataSourceFactory factory = new BasicDataSourceFactory();
    //2.info.properties配置文件添加到properties对象中 javase
    Properties properties = new Properties();
    properties.load(DBCPUtils2.class.getResourceAsStream("info.properties"));
    //3.生成连接池子 需要配置文件
    DataSource source = factory.createDataSource(properties);
    //4.获取连接
    Connection connection = source.getConnection();
    //5.执行sql语句
    String sql = "select * from student";
    Statement createStatement = connection.createStatement();
    //6.获取结果
    ResultSet executeQuery = createStatement.executeQuery(sql);
    while (executeQuery.next()) {
        System.out.println(executeQuery.getString(2));
    }
    //7.关闭连接
    connection.close(); //回收
}

二、C3P0连接池

2.1、c3p0连接池介绍

  • c3p0介绍

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
    
  • c3p0与dbcp的区别

    1.区别一
        dbcp没有自动回收空闲连接的功能
        c3p0有自动回收空闲连接功能
    2.区别二
        dbcp需要手动设置配置文件
        c3p0不需要手动设置
    

2.2、使用步骤

2.2.1、创建项目

2.2.2、导入jar包

  • 这种方式要导三个包

    1. c3p0-0.9.5.4.jar
    2. mchange-commons-java-0.2.16.jar
    3. mysql-connector-java-5.0.8.jar
  • 这种方式只用导入两个包(区别在于c3p0包的版本不用,和mysql连接包版本没关系)

    1. c3p0-0.9.1.2.jar
    2. mysql-connector-java-5.0.8.jar

2.2.2、添加配置文件

  1. 配置文件要求

    c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
    
    • 文件位置:src

    • 文件命名:c3p0-config.xml(xml文件必须这个名字,properties无所谓)

  2. 使用xml配置文件内容

    <c3p0-config>
        
        <default-config>
            
            <property name="driverClass">com.mysql.jdbc.Driverproperty>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/day2property>
            <property name="user">rootproperty>
            <property name="password">111property>
            
            
            <property name="checkoutTimeout">30000property>
            
            <property name="idleConnectionTestPeriod">30property>
            <property name="initialPoolSize">10property>
            
            <property name="maxIdleTime">30property>
            <property name="maxPoolSize">100property>
            <property name="minPoolSize">10property>
            <property name="maxStatements">200property>
        default-config>
        
        <named-config name="zhaowf">
            <property name="driverClass">com.mysql.jdbc.Driverproperty>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/day2property>
            <property name="user">rootproperty>
            <property name="password">111property>
            
            <property name="acquireIncrement">5property>
            <property name="initialPoolSize">20property>
            <property name="minPoolSize">10property>
            <property name="maxPoolSize">40property>
            <property name="maxStatements">20property>
        <property name="maxStatementsPerConnection">5property>
        named-config>
    c3p0-config>
    
    • 基本配置和命名配置的区别

      • 基本配置是默认使用的配置

      • 命名配置需要指定使用,故可以添加多种配置应对不同情况下使用

        ​ 使用方式,在创建ComboPooledDataSource dataSource对象时,我的配置中另一个名字叫zhaowf,所以参数就是zhaowf。即:

        new ComboPooledDataSource dataSource("zhaowf")

      c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
      
  3. 使用c3p0.properties配置文件内容

    c3p0.JDBC.url=jdbc:mysql://localhost:3306/ms_cms?characterEncoding=utf8
    c3p0.DriverClass=com.mysql.jdbc.Driver
    c3p0.user=root
    c3p0.pwd=123
    c3p0.acquireIncrement=3
    c3p0.idleConnectionTestPeriod=60
    c3p0.initialPoolSize=10
    c3p0.maxIdleTime=60
    c3p0.maxPoolSize=20
    c3p0.maxStatements=100
    c3p0.minPoolSize=5
    

    properties中的内容,key取什么名字都无所谓。。。艹,真没意思,发泄一下

    • 注意

      首先,c3p0一般不使bai用proerties文件来做配du置文件,dbcp一般才zhi用properties文件做配置文件。而daoc3p0一般使用xml文件做配置文件,而且c3p0连接池不需要自己手动读配置文件,因为你只要你使用上面的代码,new()一个ComboPooledDataSource()对象的时候,c3p0的jar包里面的代码会自动帮你读取你放在lib下面的jar包,不过c3p0的配置文件名必须是c3p0-config.xml,否则会无法读取。
      
      • 如果想使用properties文件,用下面方式
      public class C3P0Utils {
          //建立连接源头
      	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
      	
      	static {
      		File file = new File("c3p0-config.properties");
      		try {
      			Properties pro = new Properties();
      			pro.load(C3P0Utils.class.getResourceAsStream("db.properties"));
      			dataSource.setDriverClass(pro.getProperty("DriverClass"));
      			dataSource.setJdbcUrl(pro.getProperty("JDBC.url"));
      			dataSource.setUser(pro.getProperty("user"));
      			dataSource.setPassword(pro.getProperty("pwd"));
      		} catch (IOException | PropertyVetoException e) {
      			e.printStackTrace();
      		}
      		
      	}
      	//获取链接源
      	public static DataSource getDataSource() {
      		return dataSource;
      	}
      	//获取连接
      	public static Connection getConnection() {
      		Connection con = null;
      		try {
      			con = dataSource.getConnection();
      		} catch (SQLException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		}
      		return con;
      	}
      }
      

2.2.3、java文件内容

  • c3p0的工具类,使用xml配置的写法

    /**
    * 从连接池子中获取连接!
    *
    * C3P0的连接池子
    * 0.获取连接池子对象 DBUtils
    * 1.获取连接
    * 2.关闭资源
    */
    public class DataSourceUtils {
        private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
        /**
        * 返回连接池对象方法
        * @return c3p0连接池子
        */
        public static ComboPooledDataSource getDataSource(){
        	return dataSource;
        }
        /**
        * 连接池中获取连接的方法
        * @return 连接
        */
        public static Connection getConnection(){
            Connection conn = null;
            try {
            conn = dataSource.getConnection();
            } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
            return conn;
        }
        //关闭资源
        public static void close(Connection conn){
            if (conn != null) {
                try {
                	conn.close();
                } catch (SQLException e) {
                	e.printStackTrace();
           		}
            }
        }
        public static void close(Statement st){
            if (st != null) {
                try {
                	st.close();
                } catch (SQLException e) {
                	e.printStackTrace();
                }
            }
        }
        public static void close(ResultSet set){
            if (set != null) {
                try {
                	set.close();
                } catch (SQLException e) {
                	e.printStackTrace();
                }
            }
        }
        public static void close(Connection conn,Statement st){
            close(conn);
            close(st);
        }
        public static void close(Connection conn,Statement st,ResultSet rt){
            close(conn);
            close(st);
            close(rt);
        }
    }
    
    • 注意:如果使用其他名字的配置时,但没有该名字配置,则使用默认配置(猜测的)

      猜测原因:删除默认配置后,在上述情况后无法获取到参数,但有默认配置就可以获取到

  • 使用工具类

    public class TestC3p0 {
        public static void main(String[] args) throws Exception {
            //c3p0连接池会自动获取配置文件中的内容,只要配置文件的位置和名称无误
            //1.创建C3P0连接池子
            Connection connection = DataSourceUtils.getConnection();
            //2.使用sql语句
            Statement createStatement = connection.createStatement();
            String sql = "select * from student;";
            //3.获取结果
            ResultSet resultSet = createStatement.executeQuery(sql);
            while (resultSet.next()) {
            	System.out.println(resultSet.getString(1));
            }
            //4.关闭连接
            DataSourceUtils.close(connection, createStatement, resultSet);
        }
    }
    

三、Druid连接池

3.1、Druid介绍

Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。
Druid 由alibaba提供。

它有如下几个特点:
一. 亚秒级查询
	druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
	druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
	druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其
效性
四.多环境部署
	druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,
kafka,storm和samza等
五.丰富的社区
	druid拥有丰富的社区,供大家学习

3.2、使用步骤

3.2.1、创建项目

3.2.2、导入jar包

  1. druid-1.1.5.jar

3.2.3、配置文件

  1. 配置文件要求

    ​ 文件位置:java文件同级目录下

    ​ 文件名字:db.properties(起什么名字也都无所谓,有所谓是那种会自动读取文件的)

    ​ 好像只有c3p0有这个功能。

  2. 配置文件内容

    driverClassName=com.mysql.jdbc.Driver //驱动加载
    url=jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8 //注册驱动
    username=root //连接数据库的用户名
    password=sjw58586 //连接数据库的密码。
    filters=stat //属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall
    initialSize=2 //初始化时池中建立的物理连接个数。
    maxActive=300 //最大的可活跃的连接池数量
    maxWait=60000 //获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
    timeBetweenEvictionRunsMillis=60000 // 连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断
    minEvictableIdleTimeMillis=300000
    validationQuery=SELECT 1 //用来检测连接是否有效的sql,要求是一个查询语句。
    testWhileIdle=true //建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。
    testOnBorrow=false //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false
    testOnReturn=false //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase
    poolPreparedStatements=false //是否缓存preparedStatement,也就是PSCache。
    maxPoolPreparedStatementPerConnectionSize=200 // 池中能够缓冲的preparedStatements语句数量
    
    • 注意:

      properties配置文件不能有空格,值不能有双引号,也不能写分号。
      

3.2.4、编写java代码

  • 编写工具类(推荐这种,下面还有一中不推荐,相信也没几个会那么用)

    /**
    * 阿里的数据库连接池
    * 性能最好的
    * Druid
    * */
    public class DruidUtils {
    	private static DataSource dataSource = null;
    	static {
    		Properties pro = new Properties();
    		try {
    			pro.load(DruidUtils.class.getResourceAsStream("db.properties"));
    			dataSource = DruidDataSourceFactory.createDataSource(pro);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	//3.获取连接源
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    	//4.获取连接
    	public static Connection getConnection() {
    		try {
    			return dataSource.getConnection();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
    
  • 编写工具类(不推荐的),注意和上面代码的区别,首先实例变量就不完全一样。

    public class DruidUtils2 {
    	//1.创建连接池
    		private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    		//2.info.properties配置文件添加到properties对象中 javas
    		static {
    			Properties properties = new Properties();
    			try {
    				properties.load(DBCPUtils2.class.getResourceAsStream("info.properties"));
    				dataSource.setDriverClass(properties.getProperty("driverClassName"));
    				dataSource.setJdbcUrl(properties.getProperty("url"));
    				dataSource.setUser(properties.getProperty("username"));
    				dataSource.setPassword(properties.getProperty("password"));
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (PropertyVetoException e) {
    				e.printStackTrace();
    			}
    		}
    		//3.获取连接源
    		public static DataSource getDataSource() {
    			return dataSource;
    		}
    		//4.获取连接
    		public static Connection getConnection() {
    			try {
    				return dataSource.getConnection();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			return null;
    		}
    }
    

四、可能会遇见的问题(不定时补充)

4.1、项目出项感叹号

  • 会导致的问题:
    1. main方法无法启动,或者启动了但是执行的别的main方法
  • 解决办法
    1. 右击项目 --> Build Path --> Configure Build Path --> 右边上方的Library
    2. 此时你能看到很多带 红叉的文件,这些文件的信息最后面多有 missing
    3. 把这些带 红叉 的文件全部移除
    4. 然后 apply
    5. 就好了

你可能感兴趣的:(数据库,jdbc,数据库,mysql)