您的位置:首页 > 其它

【JDBC笔记】第三方连接池:DBCP/C3P0

2017-10-23 12:50 429 查看
JDBC第三方连接连接池

一.连接池

1.概述:

管理数据库的连接.存放多个连接对象的容器,因为,我们没获取一次连接对象,底层会很耗费资源,那连接池,能够高效的管理连接对象。

2.作用:

提高项目的性能.
在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.

3.常见连接池:

DBCP
C3P0

二.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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: