版权声明:@wrial https://blog.csdn.net/qq_42605968/article/details/85143237
什么是数据库连接池呢?
数据库连接池简而言之就是一个容器里存放一些数据库连接。
那问题来了,要数据库连接池有什么用呢?
哈哈不用急,接下来我们一起慢慢分析分析
我们仔细观察这个连接池,有没有解决刚刚开始的疑问呢?
实现连接池先继承一个DataSourse类,当然也可以选择不继承它来写一个连接池这也都是没问题的,下一步就是创建容器,然后给容器加东西,然后用的时候把它取出来,不用的时候把它又放回去(这就体现了为什么要有LinkedList了:对数据的插入和删除操作比较频繁)。
package Mail.java;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.logging.Logger;
public class DBpool implements DataSource {
public static Connection connection;
//1.常见一个pool容器,因为增删操作频繁,所以有LinkedList
static LinkedList<Connection> pool=new LinkedList<Connection>();
//2.初始化连接池为5
static {
for (int i=0;i<5;i++){
connection=JDBC_porper.getConnection();
pool.add( connection);
}
}
@Override
public Connection getConnection() throws SQLException {
//3.判断池子还有没有连接,没有的话创建连接
if (pool.size() == 0) {
for (int i = 0; i < 5; i++) {
connection = JDBC_porper.getConnection();
pool.add( connection);
}
//4.从池里取连接
connection = pool.remove(0);
}return connection;
}
//5.将连接放回池子里
public static void backconnection (Connection connection) {
pool.add( connection);
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
}
这个是简单的测试实现类,和普通JDBC最主要的区别就是,用时取,不用时放。
package Mail.java;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestDataSourse {
Connection connection;
//获得数据库连接
public void init() {
JDBC_porper jb = new JDBC_porper();
connection=jb.getConnection();
}
//增加用户
public int AddUser(){
int flag=0;
PreparedStatement ps;
DBpool dBpool=new DBpool();
try {
connection=dBpool.getConnection();
ps=connection.prepareStatement("insert into new_table values (?,?)");
ps.setString(1,"15529309441");
ps.setString(2,"wrial.qq.com");
flag=ps.executeUpdate();
if(flag>0){
System.out.println("添加成功!");
}else {
System.out.println("添加失败!");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//结束之后不是终止资源而是返回连接
DBpool.backconnection(connection);
}
return flag;
}
public static void main(String[] args) {
TestDataSourse td=new TestDataSourse();
td.AddUser();
}
}
为什么用的好好的单个连接和断开,为什么要用连接池呢?
因为在每次建立连接和断开连接都是对系统资源的一种损耗,怎么能尽量减少这种损耗呢,没错,数据库连接池就可以做到。
也可以把关闭的方法封装在Connection接口中,可以直接是实现接口调用方法,更能体现面向接口编程。