JDBC连接池&DBUtils

Posted Java知识学习记录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC连接池&DBUtils相关的知识,希望对你有一定的参考价值。

Java知识学习记录
如果对你有帮助,请关注我把!
JDBC连接池&DBUtils


JDBC连接池&DBUtils


在之前的学习中是直接跳过了这两节的学习,是因为在看其他视频的时候学习过了,今天再来学习总结一下。


使用连接池改造JDBC的工具类,


需求:


传统JDBC的操作,对连接的对象销毁不是特别好,每次创建和销毁连接都是需要花费时间,可以使用连接池优化的程序。


在程序开始的时候,可以创建几个连接,将连接放入到连接池中,用户使用连接的时候,可以从连接池中进行获取,用完之后,可以将连接归还连接池。


技术分析:


自定义连接池(了解)


* SUN公司提供了一个连接池的接口(javax.sql.DataSource)。

* 定义一个连接池:实现这个接口。

* 使用List集合存放多个连接的对象。


自定义连接池的代码:


public class MyDataSource implements DataSource{
   // 创建一个List集合用于存放多个连接对象.
   private List<Connection> list = new ArrayList<Connection>();
   // 在程序开始的时候,初始化几个连接,将连接存放到list中.
   public MyDataSource() {
       // 初始化3个连接:
       for(int i=1;i<=3;i++){
           Connection conn = JDBCUtils.getConnection();
           list.add(conn);
       }
   }
   @Override
   // 获得连接的方法:
   public Connection getConnection() throws SQLException {
       if(list.size() <= 0){
           for(int i=1;i<=3;i++){
               Connection conn = JDBCUtils.getConnection();
               list.add(conn);
           }  
       }
       Connection conn = list.remove(0);
       return conn;
   }
   // 归还连接的方法:
   public void addBack(Connection conn){
       list.add(conn);
   }
   ...
}


自定义的数据库连接池过于繁琐,并且需要额外记住自定义的API,那么常见介绍三种常见的开源的数据库连接池(DBCP、C3P0、Tomcat内置连接池)。这里着重学习C3P0。


DBCP数据库连接池


DBCP(DataBase connection pool),数据库连接池。是apache上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。


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


C3P0数据库连接池


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


C3P0连接池的使用:


1. 引入C3P0连接池的jar包

2. 编写代码、手动设置参数、配置文件设置参数


C3P0改造工具类:


public class JDBCUtils2 {
   private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();
   /**
    * 获得连接的方法
    */

   public static Connection getConnection(){
       Connection conn = null;
       try {
           conn = DATA_SOURCE.getConnection();
       } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       return conn;
   }
   ....
}


这只是一个模板,如果使用,还是要看完整的代码。


在此之前,已经对DBUtils进行了大概的学习了解,主要学习的是其中的实现类的概念以及解释,可以到文章中查看,也可以点击阅读原文查看。


关于DBUtils学习的总结


在学习了上面的知识之后,对我来说只是简单的对DBUtils有了基本的认识,下面对实际的应用做个总结吧,DBUtils最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,使用DBUtils工具类的基本步骤如下:


1. 导入数据库连接的jar包

2. 导入使用的数据库连接池工具类的jar包

3. 创建DBUtils工具类(在类中实现数据库连接的相关方法)

4. 在src下创建配置文件(c3p0-config.xml)

5. 在Dao层中的方法中使用QueryRunner类进行数据操作


下面附上步骤3-5的基本代码:


DataSourceUtils.java(在这里使用的是c3p0数据库连接池


public class DataSourceUtils {
   private static DataSource dataSource = new ComboPooledDataSource();
   private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
   // 直接可以获取一个连接池
   public static DataSource getDataSource(){
       return dataSource;
   }
   // 获取连接对象
   public static Connection getConnection() throws SQLException {
       Connection con = tl.get();
       if (con == null) {
           con = dataSource.getConnection();
           tl.set(con);
       }
       return con;
   }
   // 开启事务
   public static void startTransaction() throws SQLException {
       Connection con = getConnection();
       if (con != null) {
           con.setAutoCommit(false);
       }
   }
   // 提交并且 关闭资源及从ThreadLocall中释放
   public static void commitAndRelease() throws SQLException {
       Connection con = getConnection();
       if (con != null) {
           con.commit(); // 事务提交
           con.close();// 关闭资源
           tl.remove();// 从线程绑定中移除
       }
   }
   // 事务回滚
   public static void rollback() throws SQLException {
       Connection con = getConnection();
       if (con != null) {
           con.rollback();
       }
   }
   // 关闭资源方法
   public static void closeConnection() throws SQLException {
       Connection con = getConnection();
       if (con != null) {
           con.close();
       }
   }
   public static void closeStatement(Statement st) throws SQLException {
       if (st != null) {
           st.close();
       }
   }
   public static void closeResultSet(ResultSet rs) throws SQLException {
       if (rs != null) {
           rs.close();
       }
   }
}


c3p0-config.xml(配置文件)


<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
   <default-config>
       <property name = "user">root</property>
       <property name = "password">123456</property>
       <property name = "driverClass">com.mysql.jdbc.Driver</property>
       <property name = "jdbcUrl">jdbc:mysql://localhost:3306/数据库名称</property>
   </default-config>
</c3p0-config>


使用QueryRunner类进行数据操作(增删改查)


//这里的方法只是一个例子
public List<User> findAllUser(){
    QueryRunner runner = new QueryRunner();
    String sql = "select * from user";
    List<User> userList = runner.query(DataSourceUtils.getDataSource, sql, new BeanListHandler<User>(User.class));
    return userList;
}
/*
*数据操作包括增删改查
*获得的根据查询语句可以得到不同的结果集
*根据结果集再匹配不同的结果集
*/


THE END


在写总结的时候我发现了一个问题:如何让总结变得有意义?我认为应该是在总结中凸显重要的知识点和附上实际应用这个技术的部分代码,在今后的总结中,我认为这可以归为是一个总结的方式吧。


在平常的生活中,我意识到了,总结的重要性,在写代码的过程中,突然的对某一知识点不理解了,那说明是之前学习的不透彻,这个时候就可以直接来看这些内容了,方便、简单的帮助我复习了这部分知识。


相信许多人都有这种问题,“学习了真的记不住”,如何解决这个问题?真的只有在学习中不断的总结了,总结既是对学习知识的复习巩固,同时又是再一次思考的过程,相信每一个在学习中总结的人都能够收获满满,不断进步。加油!



以上是关于JDBC连接池&DBUtils的主要内容,如果未能解决你的问题,请参考以下文章

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例悟空教程

DBUtils和连接池

MySql & JDBC & 连接池 & 总结

数据库——DBUtils和连接池

Java基础学习笔记二十七 DBUtils和连接池

DBUtils和连接池