1: 连接池(DBCP与C3p0)
1): 之前的连接操作
拿到一个连接--->执行sql进行数据操作--->关闭连接
ps: 这样的话存在一些缺点的,比如每拿到一个连接用完后则就把这个连接关闭了,这很浪费,毕竟拿到一个连接等是需要时间的
这样也不能很好的对连接数进行控制 ,如果连接数过多的话,则可能会有内存泄漏服务器崩溃
2): 连接池
连接池则在创建一个数据库连接的缓冲池,在这个缓冲池创建时则可以在里边初始化一定的连接数,如需要获取连接时,则只需要到这个缓冲池中获取就行,
且用完后并不会把连接销毁,而是放回到缓冲池中,我们也可以设置同时的最大连接数等等,可以很好的避免之前连接操作的缺点
3): DataSource接口
对于数据库连接操作,有给我们提供了一个DataSource接口让我们来实现,
而这个接口一般会由一些开源组织或者服务器来实现
常用的有DBCP连接池与C3P0连接池, DataSource一般也叫数据源,也习惯把DataSource叫做连接池
2: DBCP连接池
1): DBCP连接池使用前提
需要导入两个jar包commons-dbcp.jar, commons-pool.jar
2): 数据源对象
数据源对象与数据库连接对象不同,它是产生(获取 )数据库连接对象的工厂
3: C3P0连接池
1): 使用前提需要导入c3p0的jar包
2): 使用
Dbcp
package com.tz.servlet.test;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;
import org.junit.Test;
public class DbcpTest {
/*
* 第二种方法
*/
@Test
public void testDataSource2() throws Exception {
Properties properties = new Properties();
InputStream inStream = DbcpTest.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(inStream);
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
Connection conn = dataSource.getConnection();
System.out.println(conn);
BasicDataSource bds = (BasicDataSource) dataSource;
System.out.println(bds.getInitialSize());
}
/*
* 第一种方法
*/
@Test
public void testDataSource() throws SQLException {
//拿到一个数据源对象
BasicDataSource dataSource = new BasicDataSource();
//设置连接基本属性值
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test?useSSL=true");
dataSource.setUsername("root");
dataSource.setPassword("123");
//设置连接池中同时最大的连接数
dataSource.setMaxActive(3);
//设置连接池启动时创建的初始化连接数
dataSource.setInitialSize(3);
//设置连接池最大的等待时间 单位毫秒
dataSource.setMaxWait(1000*4);
//设置连接池中最小的空闲连接
dataSource.setMinIdle(3);
Connection conn1 = dataSource.getConnection();
System.out.println(conn1);
Connection conn2 = dataSource.getConnection();
System.out.println(conn2);
Connection conn3 = dataSource.getConnection();
System.out.println(conn3);
//释放连接,放回连接池中
conn3.close();
//Connection conn4 = dataSource.getConnection();
//System.out.println(conn4);
}
}
c3p0
package com.tz.servlet.test;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Test {
private static ComboPooledDataSource pool = null;
static {
pool = new ComboPooledDataSource("intergalactoApp");
}
/*
* 第二种方法,使用配置文件
*/
@Test
public void testC3p0_2() throws SQLException {
Connection conn1 = pool.getConnection();
System.out.println(conn1);
Connection conn2 = pool.getConnection();
System.out.println(conn2);
Connection conn3 = pool.getConnection();
System.out.println(conn3);
Connection conn4 = pool.getConnection();
System.out.println(conn4);
}
/*
* 第一种方法
*/
@Test
public void testC3p0_1() throws PropertyVetoException, SQLException {
//创建一个ComboPooledDataSource对象
ComboPooledDataSource pool = new ComboPooledDataSource();
//设置基本连接属性值
pool.setDriverClass("com.mysql.jdbc.Driver");
pool.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=true");
pool.setUser("root");
pool.setPassword("123");
//获取连接
Connection conn = pool.getConnection();
System.out.println(conn);
}
}
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="intergalactoApp">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=true</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 设置最大的连接数 -->
<property name="maxPoolSize">3</property>
<!-- 设置连接池启动时创建的初始化连接数量 -->
<property name="initialPoolSize">3</property>
<!-- 设置最大的等待时间 -->
<property name="checkoutTimeout">5000</property>
<!-- 一个连接同时能够使用Statement对象个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>