java手写数据库连接池

**

简单实现数据库连接池

**

  1. java给我们提供了接口API*“DataResource”*
  2. 我们实现的时候也很简单,只需要自己新建一个class来实现DataResource接口.创建一个类为DButils并实现DataSource接口
  3. 当然,连接池,我们需要事先准备装装连接的池子,这里我们使用List集合来充当容器.
  4. 这里我希望在刚加载好类的时候就创建好连接,于是将创建连接放入了静态代码块里面在这里插入图片描述
    代码也很简单,就是用了一个循环创建了10个连接并添加到了list集合里面.
  5. 实现了DataResource接口,当然同时也实现了其方法,而我们这里就只需要关注其中的*getConnection()*方法即可.
  6. 在这里我们必须考虑当我们最开始创建的;连接用完的情况,如此,代码如下在这里插入图片描述
    可以看到,实现并不复杂.(注意:list集合只能用remove()方法移除连接.这是为了防止多用户拿到同一个连接’)
  7. 下面就是归还连接了,定义一个close方法,首先判断此连接是否为空并且此连接是否关闭,如果关闭了的话就没必要放回连接池了.在这里插入图片描述
  8. 好了,都已实现完成,下面来测试一波.
    在这里插入图片描述
    新建了一个测试类,并对数据库进行连接测试
    在这里插入图片描述
    经过测试,简单连接池手写完成,
  9. 附上完整代码
    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;
    }
}

  1. 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);
        }
    }
}

第一次写,有很多不足,单纯只为记笔记,越努力,越幸运.加油!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值