今天学习了连接池和DBUtils
1.什么是连接池
连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。
2.连接池的工作原理
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。
第二、连接池的管理。当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
3.常见的连接池:DBCP,C3P0
4.C3P0连接池的使用:
第一,导入jar包
第二,添加配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config><!--默认的连接--> <property name="user">root</property> <property name="password">填写密码</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/填写数据库名?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8</property> </default-config>
<named-config name="oracle"><!--有命名的连接-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_07</property>
<property name="user">root</property>
<property name="password">123</property>
</named-config>
</c3p0-config>
第三,对连接池进行操作
public void testAddUser1() { Connection conn = null; PreparedStatement pstmt = null; try { // 2.从池子中获取连接 conn = C3P0Utils.getConnection();//这个构造函数无参,直接调用xml文件种默认的连接,有参则需和xml文件中的<named-config name="oracle">保持一致,此时直接调用这个连接 String sql = "insert into tbl_user values(null,?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "吕布3"); pstmt.setString(2, "貂蝉3"); int rows = pstmt.executeUpdate(); if (rows > 0) { System.out.println("添加成功!"); } else { System.out.println("添加失败!"); } } catch (Exception e) { throw new RuntimeException(e); } finally { JDBCUtils_V3.release(conn, pstmt, null); } }
5.DBUtils:DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。补充一下,传统操作数据库的类指的是JDBC
6.DBUtils两个核心类和一个接口:
DBUtils类
主要为关闭连接,装载JDBC驱动程序之类的常规工作提供方法,都是静态的方法
QueryRunner类
简化了执行SQL语句的代码它与ResultSetHandler组合在一起减少编码量
常用的方法:
2.queryString sql,ResultSetHandler rsh,Object[ ] params)
3..query(Connection conn,String sql,ResultSetHandler rsh)
4.update(Connection conn,String sql,Object[ ] params)
5.update(Connection conn,String sql)
ResultSetHander接口
用于处理ResultSet结果集,将结果集的的数据转换成不同形式。
7.DBUtils+C3P0实现数据库的增删改查
思路:编写一个xx类,在类中获取连接
编写Dao层,使用QueryRunner类执行sql语句,实现QueryRunner接收操作结果
C3P0xml文档如上
xx类
package DBUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DBUtils { private static DataSource dataSource = new ComboPooledDataSource();//自动加载xml文档 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); } } // 事务回滚 public static void rollback() throws SQLException { Connection con = getConnection(); if (con != null) { con.rollback(); } } // 提交并且 关闭资源及从ThreadLocall中释放 public static void commitAndRelease() throws SQLException { Connection con = getConnection(); if (con != null) { con.commit(); // 事务提交 con.close();// 关闭资源 tl.remove();// 从线程绑定中移除 } } // 关闭资源方法 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(); } } }
Dao层:
public class Dao { @Test public void delete() throws SQLException { QueryRunner qr = new QueryRunner(DBUtils.getDataSource()); String sql="delete from zhangziyi where zhanghao=?"; qr.update(sql,"zhangziyi"); } }