JDBC第三方连接连接池
一.连接池
1.概述:
管理数据库的连接.存放多个连接对象的容器,因为,我们没获取一次连接对象,底层会很耗费资源,那连接池,能够高效的管理连接对象。2.作用:
提高项目的性能.在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.3.常见连接池:
DBCPC3P0
二.DBCP
1.概述:
DBCP(DataBase connection pool) 数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar和commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
2.使用步骤:
a.导入jar包(commons-dbcp.jar和commons-pool.jar)b.配置文件的方式/硬编码模式(不推荐)
3.代码:
a.硬编码方式:
1.硬编码的方式 创建对象 BasicDataSource ds = new BasicDataSource(); //设置参数 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql:///mydemo"); ds.setUsername("root"); ds.setPassword("123456"); //获取预编译对象 Connection conn = ds.getConnection(); String sql="insert into user values(?,?)"; PreparedStatement statement = conn.prepareStatement(sql); statement.setNull(1,Types.INTEGER); statement.setString(2,"王五"); statement.executeUpdate(); ds.close();
b.配置文件方式:
配置文件:
#连接基本设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day39 username=root password=root
#<!--扩展配置 了解--> #初始化连接 initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=gbk #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED
Java代码:
import java.io.FileInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Types; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPDemo { public static void main(String[] args) throws Exception{ //表 id 设置 primary key auto_increment Properties p = new Properties(); p.load(new FileInputStream("src/dbcp.properties")); DataSource bdsf = BasicDataSourceFactory.createDataSource(p); Connection c = bdsf.getConnection(); String sql="insert into users3 values(?,?)"; PreparedStatement ps = c.prepareStatement(sql); ps.setNull(1, Types.INTEGER); ps.setString(2, "Ying"); ps.executeUpdate(); } }
三.C3P0
1.概述:
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
2.C3P0和DBCP的区别:
- dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
3.代码:
a.硬编码方式:
//创建对象 ComboPooledDataSource ds = new ComboPooledDataSource(); //设置参数 ds.setJdbcUrl(""); ds.setDriverClass(""); ds.setUser(""); ds.setPassword(""); //获取连接对象 Connection conn = ds.getConnection(); PreparedStatement statement = conn.prepareStatement(""); //执行 statement.executeUpdate();
b.配置文件方式:
注意:
- 配置文件的文件名和后缀名固定的 c3p0.properties
- 必须放在src目录下
配置文件:
xml:
<c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <!-- 基本配置 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day39</property> <property name="user">root</property> <property name="password">root</property> <!--扩展配置--> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> <!-- 命名的配置 --> <named-config name="yangfan"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day39</property> <property name="user">root</property> <property name="password">root</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <property name="initialPoolSize">20</property> <property name="minPoolSize">10</property> <property name="maxPoolSize">40</property> <property name="maxStatements">20</property> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
properties:
c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql:///day39 c3p0.user=root c3p0.password=root
java:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Types; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Demo { public static void main(String[] args) throws SQLException { // ComboPooledDataSource ds = new ComboPooledDataSource(); // 使用xml配置文件中的第二配置 参数是你的第二配置名称 ComboPooledDataSource cpds = new ComboPooledDataSource(); // ComboPooledDataSource cpds = new ComboPooledDataSource("yangfan"); Connection c = cpds.getConnection(); String sql ="insert into users4 values(?,?)"; PreparedStatement ps = c.prepareStatement(sql); ps.setNull(1, Types.INTEGER); ps.setString(2, "Ash"); ps.executeUpdate(); cpds.close(); } }