Javaweb总结2—自定义JDBC数据库连接池

版权声明:@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接口中,可以直接是实现接口调用方法,更能体现面向接口编程。

猜你喜欢

转载自blog.csdn.net/qq_42605968/article/details/85143237
今日推荐