Java开发基础(三)——JDBC连接池

    xiaoxiao2022-07-07  201

    文章目录

    前言常见的连接池DBCP连接池C3P0连接池 总结链接地址

    前言

    数据库连接很昂贵。获取一个与数据库的连接,整个系统在背后要做很多消耗资源的事情,大多数时候,创建连接的时间比执行sql语句的时间还要长。故Java使用连接池机制替代了直接建立连接的方式。

    常见的连接池

    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池! 注:

    驱动是由数据库厂商提供,是对Java的JDBC接口的实现连接池不是数据库厂商提供的,如DBCP是Apache提供的,C3P0连接池则是开源项目,要求各个厂商必须实现Java提供的BasicDataSource接口来对接各类连接池。

    连接池实现 注册驱动 和 获取连接 两部分功能。

    DBCP连接池

    添加jar包 :commons-dbcp-1.4.jar和commons-pool-1.5.6.jar Apache官网的下载地址添加属性配置文件dbcpconfig.properties(这个文件的名字可以随意修改)

    方式一: dbcpconfig.properties在当前工程的根目录使用

    Properties ps = new Properties(); ps.load(new FileInputStream("dbcpconfig.properties"));

    方式二:dbcpconfig.properties在src目录下时使用

    // 类加载器 ps.load(DBCPUtils02.class.getClassLoader().getResourceAsStream("dbcpconfig.properties")); 编写工具类 DBCPUtils.java import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPUtils { // 工具类的作用:获取一个数据库连接 private static DataSource ds = null; //静态代码块,设置ds的四大要素 static{ Properties ps = new Properties(); try { // dbcpconfig.properties在当前工程的根目录使用 // ps.load(new FileInputStream("dbcpconfig.properties")); // dbcpconfig.properties在src目录下时使用 类加载器 ps.load(DBCPUtils02.class.getClassLoader().getResourceAsStream("dbcpconfig.properties")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { ds = BasicDataSourceFactory.createDataSource(ps); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ //返回一个连接对象,不要用DriverManager获取,而是连接池中获取 return ds.getConnection(); } //关闭所有资源的统一代码 public static void closeAll(Connection conn, Statement st, ResultSet rs){ //负责关闭 if(conn != null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(st != null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } DBCPUtilsTestDemo.java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBCPUtilsTestDemo { public static void main(String[] args) throws SQLException { // insert(); // update(); query(); } public static void insert() throws SQLException{ // 1.获取连接 Connection conn = DBCPUtils.getConnection(); // 2.获取执行对象 String sql = "insert into users (username,passwd) values (?, ?)"; PreparedStatement pst = conn.prepareStatement(sql); pst.setObject(1, "coco"); pst.setObject(2, "2426"); // 3.执行语句 int rows = pst.executeUpdate(); System.out.println(rows); DBCPUtils.closeAll(conn, pst, null); } public static void update() throws SQLException{ // 1.获取连接 Connection conn = DBCPUtils.getConnection(); // 2.获取执行对象 Statement st = conn.createStatement(); // 3.执行sql int rows = st.executeUpdate("update users set passwd = 'co' where uid = 6"); System.out.println(rows); DBCPUtils.closeAll(conn, st, null); } public static void query() throws SQLException{ // 1.获取连接 Connection conn = DBCPUtils.getConnection(); // 2.获取执行对象 Statement st = conn.createStatement(); // 3.执行查询 ResultSet rs = st.executeQuery("select * from users where username = 'coco'"); // 4.处理结果集 while(rs.next()){ System.out.println(rs.getObject("uid") + "\t" + rs.getObject("username") + "\t" + rs.getObject("passwd")); } DBCPUtils.closeAll(conn, st, rs); } } dbcpconfig.properties #连接设置 ,必须配置的 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db02 username=root password=root #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=REPEATABLE_READ

    C3P0连接池

    使用步骤:

    添加jar包 c3p0-0.9.1.2.jar mchange-commons-java-0.2.11.jar c3p0下载地址

    编写配置文件c3p0-config.xml,放在src中 ComboPooledDataSource对象会自动加载c3p0-config.xml文件,所以使用c3p0时,这个文件的名字不能随意修改。

    编写工具类

    C3P0Utils.java /** * 在C3P0连接池中 遵循了javax.sql.DataSource接口的实现类: * ComboPooledDataSource */ import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Utils { private static ComboPooledDataSource ds = new ComboPooledDataSource(); // 自动加载C3P0-config.xml文件 // static代码块设置数据库连接四大要素 static{ } public static Connection getConnection() throws SQLException{ // 获取连接,从C3P0连接池获取 return ds.getConnection(); } // 关闭所有资源的统一代码 public static void closeAll(Connection conn, Statement st, ResultSet rs){ //负责关闭 if(conn != null){ try { conn.close(); // 使用代理,放回到连接池中 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(st != null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } C3P0UtilsTestDemo.java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class C3P0UtilsTestDemo { public static void main(String[] args) throws Exception { // insert(); // delete(); query(); } public static void insert() throws Exception{ //1.获取连接 Connection conn = C3P0Utils.getConnection(); //2.获取执行对象 Statement st = conn.createStatement(); //3.执行sql int rows = st.executeUpdate("insert into users (username, passwd) values ('lanna', 'summer')"); System.out.println(rows); //4.关闭资源 C3P0Utils.closeAll(conn, st, null); } public static void delete() throws SQLException{ //1.获取连接 Connection conn = C3P0Utils.getConnection(); //2.获取执行对象 String sql = "delete from users where username = ?"; PreparedStatement pst = conn.prepareStatement(sql); pst.setObject(1, "coco"); int rows = pst.executeUpdate(); System.out.println(rows); // 4.关闭资源 C3P0Utils.closeAll(conn, pst, null); } public static void query() throws SQLException{ //1.获取连接 Connection conn = C3P0Utils.getConnection(); //2.获取执行对象 String sql = "select * from users"; PreparedStatement pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(); while(rs.next()){ System.out.println(rs.getObject("uid")+"\t"+rs.getObject("username") +"\t"+rs.getObject("passwd")); } // 4.关闭资源 C3P0Utils.closeAll(conn, pst, rs); } } c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db02</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">10</property> </default-config> </c3p0-config>

    总结

    本文介绍了JDBC的两种连接池DBCP和C3P0。代码封装了很多东西,所以即使有部分看不懂也可以用,但是感觉有点难受。可能是以前看C语言这种代码多了吧。

    链接地址

    Apache官网的下载地址 c3p0下载地址

    最新回复(0)