很久没用原生连接池,最近想写个小功能,结果发现很多地方不太懂,然后网上搜了半天的 c3p0 相关内容,全不符合我想要的。相同内容太多 而且没什么,所以我自己来总结下吧。
01 总结全文
从以下来总结
- 连接池的作用,为什么要使用连接池
- 书写自己的连接池,用于理解框架 c3p0 等连接池
- 连接池框架 c3p0 使用
- 连接池框架 c3p0 和 DBUtils 的配合使用
- 配合事务的使用(重点,这块很多人都说不明白)
02 分析
0201 连接池的作用,为什么要使用连接池
首先我们操作数据库都需要连接,平时获取连接、关闭连接如果频繁,就会浪费资源,占用CPU。所以这里我们用一个池子来存放连接。
先自定义一个自己的连接池,这些内容太简单,我直接上代码。相信大家很容易看懂。
public class CustomConnectionUtils {
private static LinkedList<Connection> pool = new LinkedList<Connection>();
/**
* 初始化连接池 添加3个连接到池子中去
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
for(int i=0;i<3;i++){
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1", "root", "root");
pool.add(connection);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return
*/
public static Connection getConnection(){
try {
if(!pool.isEmpty()){
Connection connection = pool.removeFirst();
return connection;
}
//如果没有连接 等待 100 毫秒 然后继续
Thread.sleep(100);
return getConnection();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
/**
* 归还连接 其实就是重新将连接添加到池子中去
* @param connection
*/
public static void release(Connection connection){
if(connection != null){
pool.add(connection);
}
}
}
0202 c3p0连接池使用
免费的连接池有很多,如果不配合 spring 。单独使用,我个人还是喜欢使用 c3p0。
第一步 添加依赖
<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
第二步 配置文件
配置文件命名只能 c3p0-config.xml
,位置放在 idea–>src–>resources–>c3p0-config.xml
然后就是它的配置,有两种情况
- 默认不设定名字
- 设定名字