连接池的作用
实际开发中”获取资源”和”释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享Connection连接。这样我们就不需要每次都创建连接和关闭连接了,这些操作都交给连接池。
连接池概念:管理Connection,重复使用使用Connection。调用close()不会关闭Connection,而是将Connection归还给连接池,使连接池可以重复使用Connection。
规范:
java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!**
c3p0连接池
c3p0是免费开源的连接池!使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml。
使用步骤:
- 创建连接池对象(获取数据源)
- 必须设置的参数
- DriverClass
- url
- username
- password
- 设置其他参数
- 从连接池中获取连接对象 ```java package c3p0.demo.ba1;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException;
public class C3P0Demo1 { public static void main(String[] args) throws PropertyVetoException, SQLException { //1.创建连接池(获取数据源) ComboPooledDataSource dataSource = new ComboPooledDataSource(); //2.基本参数设置 dataSource.setDriverClass(“com.mysql.cj.jdbc.Driver”); dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mydb”); dataSource.setUser(“root”); dataSource.setPassword(“root”); //3.设置其他参数 dataSource.setInitialPoolSize(5);//初始连接数 dataSource.setMinPoolSize(3);//最小连接数 dataSource.setMaxPoolSize(10);//最大连接数 dataSource.setAcquireIncrement(2);//每次增长的连接数 dataSource.setMaxIdleTime(30);//最大空闲时间-以秒为单位 - 当连接空闲时自动回收
//从连接池中获取连接对象Connection conn = dataSource.getConnection();System.out.println(conn);}
}
<a name="Obq0a"></a>
## c3p0连接池 - 工具类
- **new ComboPooledDataSource(配置文件内的配置名称); - 使用配置文件给连接池传入参数**
**<br />配置文件:<br />注意:配置文件要放在src目录下
```java
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</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>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
<!-- 命名的配置 -->
<named-config name="igeek">
<!-- 连接数据库的4项基本参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">20</property>
<!-- 最小连接受 -->
<property name="minPoolSize">10</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
<property name="maxStatements">0</property>
<!-- 连接池内单个连接所拥有的最大缓存statements数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
package c3p0.demo.ba1;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Utils {
//创建一个连接池
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//封装一个方法
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//获取源数据,为了创建连接池的数据服务
public static DataSource getSource(){
return dataSource;
}
//测试
public static void main(String[] args) throws SQLException {
Connection conn = getConnection();
System.out.println(conn);
DataSource data = getSource();
}
}
dbcp连接池
DBCP也是一个开源的连接池,是Apache Common(第三方非盈利组织)成员之一,tomcat内置的连接池。
dbcp连接池与c3p0的使用大同小异。但是配置文件不同。
dbcp的配置文件是properties格式。
properties文件不能编写中文,不支持在STS中修改,必须使用记事本修改内容,否则中文注释就乱码了。
dbcp-config.properties文件:
#基本配置内容
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=UTF-8
defaultAutoCommit=true
defaultReadOnly=NONE
defaultTransactionIsolation=READ_UNCOMMITTED
dbcp连接池 - 工具类
package c3p0.demo.ba2;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* DBCP工具类 - 使用配置文件的形式
*/
public class DBCPUtils {
//1.创建连接池
private static DataSource dataSource;
//2.使用静态代码块加载数据 - 获取配置文件中的数据
static{
try {
//加载properties文件
InputStream in =
DBCPUtils.class.getClassLoader()
.getResourceAsStream("dbcp-config.properties");
Properties prop = new Properties();
prop.load(in);//获取到流
//通过工厂模式创建连接对象
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e){
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnectin() throws SQLException {
return dataSource.getConnection();
}
//获取数据源
public static DataSource getSource(){
return dataSource;
}
//测试
public static void main(String[] args) throws SQLException {
Connection conn = getConnectin();
System.out.println(conn);
DataSource source = getSource();
System.out.println(source);
}
}
