JAVA数据库连接池从原理、配置到最终实现,让你彻底明白

一、连接池概念就不讲了,百度一下。
二、java连接池规范:由于原始的链接数据库jar包接口写的不规范,之前各种数据库的jar包都是各数据库厂商自己写的,没有统一的规范。后来sun公司定义了连接池的规范接口( javax.sql.DataSource),只是定义了连接池对象(DataSource)、增删改查(prepareStatement)、连接(Connection)等接口。各数据库厂商来实现统一的接口。 这样我们以后引入jar包的的时候其实不可以不用关系各数据库厂商怎么实现接口的!目前主流的有dbcp和c3p0两种连接池,这里再另外说句,各数据库厂商的jar包只是写了怎么连接数据库、怎么对数据进行操作如mysql-connector-java-5.0.8-bin.jar。而dbcp和c3p0的两个jar包是用来构建连接池的,记住只是单纯的创建连接池。
三、各jar包再次说明:
(1)mysql-connector-java-5.0.8-bin.jar是mysql数据库厂商写的针对mysql数据库连接、操作的jar包。
(2)c3p0-0.9.1.2.jar 是用来创建各种数据库连接池的jar包。
(3)jdbcTemplate和DBUtilsjdbcTemplate类似,提供了一系列的增删改差的操作,属于spring封装好的工具包,我们如果细看DBUtis和JdbTemplet源码,可以看到在调用他们各自的增删改查方法的时候,源码实际上都是调用的java规范的接口PreparedStatement,而PreparedStatement
就是java定义的其中一个规范接口,mysql、oracle等各大数据库厂商,在各自的数据库驱动jar包中实现了规范接口。
总结:实际上我们利用数据库厂商提供的jar就能对数据库进行连接、增删改查。但是每次操作都要连接、关闭数据库太消耗内存,所以又诞生了连接池。又由于各数据库厂商提供的增删改查的接口用起来又比较麻烦,所以又诞生了jdbcTemplate和DBUtilsjdbcTemplate,通过引入这俩包,我们对数据库的操作又会简化很多。
四、连接池配置(只讲C3P0)
(1)创建c3p0-config.xml文件,怎么配置网上很多每个人都能学会,我这里讲的是整个流程,不是网上都能有找到的。

   <!--配置连接池mysql-->
    <named-config name="mysql"> 
        <property name="driverClass">com.mysql.jdbc.Driver</property> 
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/study</property> 
        <property name="user">root</property> 
        <property name="password">123456</property> 
    </named-config> 

(2)创建连接池对象,为什么要创建连接池对象?上面我们配置的只是一些参数,c3p0-config.xml文件里面我们可以配置多个各种数据库的连接池,通过named-config name的value值区分。

public class C3P0Util {
static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getLogger(C3P0Util.class.getName());
    //通过标识名来创建相应连接池,new ComboPooledDataSource就是C3P0jar包里面的,通过这个new出来一个连接池ComboPooledDataSource对象,其实也可以写成 static DataSoource dataSource=new ComboPooledDataSource("mysql");为什么能这么写呢,因为ComboPooledDataSource是连接池,java定义了规范的连接池接口DataSource,C3P0的连接池(ComboPooledDataSource)实现了DataSource接口。
    static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql");
    //获取上面的连接池  
    public static DataSource getDataSource() {
		return dataSource;
	}
    //从连接池中取用一个连接,java规范接口DataSource接口里面定义了getConnection方法,用来获取一个connection对象,这里我们就能看到 ,我们不用再关系C3P0怎么实现连接的了,直接用就可以。
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
            
        } catch (Exception e) {
            logger.error("Exception in C3p0Utils!", e);
            throw new Error("数据库连接出错!", e);            
        }
    }    
    //释放连接回连接池
     public static void close(Connection conn,PreparedStatement pst,ResultSet rs){  
            if(rs!=null){  
                try {  
                    rs.close();  
                } catch (SQLException e) {  
                    logger.error("Exception in C3p0Utils!", e);
                    throw new Error("数据库连接关闭出错!", e);            
                }  
            }  
            if(pst!=null){  
                try {  
                    pst.close();  
                } catch (SQLException e) {  
                    logger.error("Exception in C3p0Utils!", e);
                    throw new Error("数据库连接关闭出错!", e);    
                }  
            }  
      
            if(conn!=null){  
                try {  
                    conn.close();  
                } catch (SQLException e) {  
                    logger.error("Exception in C3p0Utils!", e);
                    throw new Error("数据库连接关闭出错!", e);    
                }  
            }  
        }  
}

(3)如果我们只是单纯的用连接池jar,没有用到DBUtils或者JDBCTemplate的jar包,我们只能用java规范接口里面的prepareStatement和executeUpdate来对数据库进行操作。显然是很麻烦的,每次操作都要写一个方法。

 public void testInsert(){
           try {
                conn = C3P0Util.getConnection();
                ps = conn.prepareStatement("insert into users(username) values('ggg')");
                ps.executeUpdate();
           } catch (Exception e) {
                e.printStackTrace();
           }finally{
                C3P0Util.close(conn, ps, rs);
                
           }
           System.out.println(conn.getClass().getName());
     }

五、DBUtils或者JDBCTemplate,用这俩个jar就不用向上面似的每次操作都要写个方法。
(1)(DBUtils)通过QueryRunner对象对数据库操作
第一步:得到连接池,其中C3P0Utils.getDataSource()就是上面代码New出来的一个DataSource

QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());

第二步:对数据库操作

queryRunner.update("Update users set username='test2' where id = ?",8);

(2)(JDBCTemplate)通过jdbcTemplate对象对数据库操作
第一步:得到连接池

JdbcTemplate jdbcTemplate= new JdbcTemplate(C3P0Utils.getDataSource());

第二步:操作数据库

jdbcTemplate.queryForList("select *from user;");
发布了40 篇原创文章 · 获赞 4 · 访问量 6326

猜你喜欢

转载自blog.csdn.net/oFlying1/article/details/83744739