《JDBC》_C3P0
1.数据库连接池
-
连接池是创建和管理连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
-
应用程序直接获取连接的缺点:用户每次请求都需要向数据库获得连接,而数据库创建连接需要消耗较大的资源、较长的时间。假设网站一天十万访问量,数据库服务器就要创建10万次连接,极大的浪费数据库的资源,并且容易造成数据库服务器内存溢出。
-
而采用连接池技术,用户可以直接使用连接池中已创建好的连接,与数据库通信。
2.C3P0的使用
C3P0是一个开源的JDBC连接池
- 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:///jdbctest</property>
<property name="user">root</property>
<property name="password">abc</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
-
JDBCUtils.java
package com.imooc.jdbc.utils; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * JDBC的工具类 * @author jt * */ public class JDBCUtils2 { private static final ComboPooledDataSource dataSource = new ComboPooledDataSource(); /** * 获得连接的方法: * @throws SQLException */ public static Connection getConnection() throws Exception{ Connection conn = dataSource.getConnection(); return conn; } /** * 资源释放 */ public static void release(Statement stmt,Connection conn){ if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } public static void release(ResultSet rs,Statement stmt,Connection conn){ if(rs!= null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }
-
DataSourceDemo1.java
package com.imooc.jdbc.demo3; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; import com.imooc.jdbc.utils.JDBCUtils; import com.imooc.jdbc.utils.JDBCUtils2; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 连接池的测试类 * @author jt * */ public class DataSourceDemo1 { @Test /** * 使用配置文件的方式 */ public void demo2(){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ /*// 获得连接: ComboPooledDataSource dataSource = new ComboPooledDataSource();*/ // 获得连接: // conn = dataSource.getConnection(); conn = JDBCUtils2.getConnection(); // 编写Sql: String sql = "select * from user"; // 预编译SQL: pstmt = conn.prepareStatement(sql); // 设置参数 // 执行SQL: rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils2.release(rs, pstmt, conn); } } @Test /** * 手动设置连接池 */ public void demo1(){ // 获得连接: Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ // 创建连接池: ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 设置连接池的参数: dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql:///jdbctest"); dataSource.setUser("root"); dataSource.setPassword("abc"); dataSource.setMaxPoolSize(20); dataSource.setInitialPoolSize(3); // 获得连接: conn = dataSource.getConnection(); // 编写Sql: String sql = "select * from user"; // 预编译SQL: pstmt = conn.prepareStatement(sql); // 设置参数 // 执行SQL: rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("uid")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(rs, pstmt, conn); } } }