都是连接池,关于c3p0与dbcp的区别

       如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复使用Connection。有了池我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。这里我们常用的连接池有两种,分别是:DBCP连接池和C3P0连接池,下边是对两种连接池的具体使用和比较。

       DBCP的使用说明

       导包

 都是连接池,关于c3p0与dbcp的区别

在使用写连接池工具类的时候,可以通过配置文件来连接数据库,配置文件中记录了连接数据库的驱动、URL、用户名和密码等信息,但要注意这里的文件后缀为:“.properties”。把通过配置文件连接数据库的部分写在静态代码块中,随着类的加载只加载一次。出了连接数据库,还要提供一个获得数据源的方法和一个获取连接的方法,下边是把连接池写成一个工具类的代码,写成工具类和直接使用的代码几乎相同,就不在重复的写了。

都是连接池,关于c3p0与dbcp的区别

连接数据库工具类--代码:

  1. public class DBCPUtils {

  2. //首先定义私有的datasource

  3. private static DataSource datasource;

  4. //把配置文件部分放在静态代码块中,调用时直接加载

  5. static{

  6.  
  7. try {

  8. //加载文件

  9. InputStream is=DBCPUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");

  10. //实例化properties集合

  11. Properties prop=new Properties();

  12. prop.load(is);

  13. //首先加载核心类

  14. datasource=BasicDataSourceFactory.createDataSource(prop);

  15. } catch (Exception e) {

  16. // TODO Auto-generated catch block

  17. e.printStackTrace();

  18. }

  19.  
  20. }

  21. //提供获得数据源

  22. public static DataSource getDataSource(){

  23. return datasource;

  24. }

  25. //提供获得连接

  26. public static Connection getConnection() throws SQLException{

  27. return datasource.getConnection();

  28. }

  29. }

c3p0连接池:

导包

 

都是连接池,关于c3p0与dbcp的区别

这种连接池在进行数据库的连接的时候有两种连接方法:使用配置文件和不使用配置文件两种。当然使用配置文件的时候代码要简介的多,配置文件中同样是记录了连接数据库的驱动、URL、用户名和密码等信息。

      不使用配置文件的代码:三个步骤:1、导入核心类:ComboPooledDataSource 2、基本的四项设置,也就是设置驱动,URL,用户名和密码等四项。3、其他四项。代码如下:  

  1. public class c3p0_test01 {

  2. public static void main(String[] args) throws Exception {

  3.  //导入一个核心类

  4. ComboPooledDataSource dataSource = new ComboPooledDataSource();

  5. //基本四项设置

  6. dataSource.setDriverClass("com.mysql.jdbc.Driver");

  7. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db_name");

  8. dataSource.setUser("root");

  9. dataSource.setPassword("123");

  10. //其他四项设置

  11. dataSource.setInitialPoolSize(10); //初始化连接个数

  12. dataSource.setMaxPoolSize(40); //最大链接数

  13. dataSource.setMinPoolSize(5); //设置最小链接数

  14. dataSource.setAcquireIncrement(2); //设置每次增加的连接数

  15. Connection conn=dataSource.getConnection(); //进行数据库连接

  16. System.out.println(conn);

  17. }

  18. }

如果使用配置文件连接数据库,其中配置文件中的内容为:

都是连接池,关于c3p0与dbcp的区别 

使用配置文件进行连接的写法如下:

  1. import java.sql.Connection;

  2. import java.sql.SQLException;

  3. import javax.sql.DataSource;

  4. import org.apache.commons.dbutils.QueryRunner;

  5. import com.mchange.v2.c3p0.ComboPooledDataSource;

  6.  
  7. public class C3P0Utils {

  8. //1、提供私有化的数据源 使用默认设置

  9. private static ComboPooledDataSource datasource=new ComboPooledDataSource();

  10. //使用命名配置

  11. //private static ComboPooledDataSource datasource =new ComboPooledDataSource("itheima");

  12. //2.提供对外的数据源

  13. public static DataSource getDataSource(){

  14. return datasource;

  15. }

  16. //3.提供对外的链接

  17. public static Connection getConnection() throws SQLException{

  18. return datasource.getConnection();

  19. }

  20. }

 

对比:

 从上边的这两个连接池的代码无论是使用DBCP还是使用C3P0连接池,在写成工具类后都要对外提供一个数据源DateSource和一个连接Connection。作用是,如果我们在进行数据库操作的时候要是使用DBUtils类的时候,就要使用QueryRunner核心类,而这个类在进行与数据库连接的时候只要一句代码:

     QueryRunner qr=newQueryRunner(数据源);这里的数据源,我们可以通过两个连接池获得:C3P0Utils.getDataSource() ,或者:DBCPUtils.getDataSource()获得。如果不使用DBUtils工具类,我们就可以直接通过C3P0Utils.getConnection()或者  DBCPUtils .getConnection()来直接获得连接。