**
简单实现数据库连接池
**
- java给我们提供了接口API*“DataResource”*
- 我们实现的时候也很简单,只需要自己新建一个class来实现DataResource接口.
- 当然,连接池,我们需要事先准备装装连接的池子,这里我们使用List集合来充当容器.
- 这里我希望在刚加载好类的时候就创建好连接,于是将创建连接放入了静态代码块里面
代码也很简单,就是用了一个循环创建了10个连接并添加到了list集合里面. - 实现了DataResource接口,当然同时也实现了其方法,而我们这里就只需要关注其中的*getConnection()*方法即可.
- 在这里我们必须考虑当我们最开始创建的;连接用完的情况,如此,代码如下
可以看到,实现并不复杂.(注意:list集合只能用remove()方法移除连接.这是为了防止多用户拿到同一个连接’) - 下面就是归还连接了,定义一个close方法,首先判断此连接是否为空并且此连接是否关闭,如果关闭了的话就没必要放回连接池了.
- 好了,都已实现完成,下面来测试一波.
新建了一个测试类,并对数据库进行连接测试
经过测试,简单连接池手写完成, - 附上完整代码
DButilspool 类
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
public class DButilspool implements DataSource {
private static List<Connection> list= new LinkedList<>();
static {
try {
Class.forName("com.mysql.jdbc.Driver");
for (int i = 0; i <10 ; i++) {
Connection connection= DriverManager.getConnection("jdbc:mysql:///book",
"root","123456");
list.add(connection);
}
System.out.println("创建了"+list.size()+"个连接");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
return null;
}
@Override
public Connection getConnection(String user,String password) throws SQLException {
if (list==null) {
for (int i = 0; i <10 ; i++) {
Connection connection= DriverManager.getConnection("jdbc:mysql:///book",user,password);
list.add(connection);
}
}
Connection co=list.remove(0);
System.out.println("取出了一个连接,还有"+list.size()+"个连接");
return co;
}
public void close(Connection conn){
try {
if (conn!=null&&!conn.isClosed()){
list.add(conn);
System.out.println("归还了一个连接,还有"+list.size()+"个连接");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@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;
}
}
- TestDB类
import java.sql.*;
public class TestDB {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
DButilspool dButilspool = new DButilspool();
try {
connection=dButilspool.getConnection("root","123456");
preparedStatement= connection.prepareStatement("select * from user ");
resultSet=preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString(2)+"------"+resultSet.getString(3)+"\n");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
dButilspool.close(connection);
}
}
}
第一次写,有很多不足,单纯只为记笔记,越努力,越幸运.加油!