当前位置: 主页 > 数据库

数据库怎么停止-麦库记事停止服务

发布时间:2023-02-11 10:18   浏览次数:次   作者:佚名

数据库连接池 一、简介

什么是数据库连接池?

首先,让我们回滚 JDBC 代码流

// 1. 注册驱动
// DriverMananger.register(new Driver());
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接 JDBC4Connection
Connection conn = DriverManager.getConnection(String url,String username,String password);
// 3. 获取statement对象
Statement statement = conn.createStatement();
// 4. 通过statement对象发送SQL语句到MySQL服务器
ResultSet ret = statement.executeQuery("select * from account");
// 5. 解析结果集
while (ret.next()) {
    
    String name = ret.getString("name");
    int id = ret.getInt("id");
}
// 6. 关闭资源(ResultSet、Statement、Connection)
ret.close();
statement.close();
connection.close();

我们发现上面提到的JDBC最原始的过程就是一开始和数据库建立连接,然后对数据库进行操作。 操作完数据库后,连接等资源都关闭了,而数据库的连接资源是比较珍贵的,所以我们要优化我们的程序,让这个连接可以重复使用,这样在使用JDBC的时候,就不需要在开始时创建一个新连接,但使用以前使用的连接。 之后,它不会关闭,但会保存连接以备下次使用。 这样做的好处是可以提高效率。

那么我们如何保存与数据库的连接呢?我们可以使用池化(线程池)的思想来保存连接,我们称之为数据库连接池

在这里插入图片描述

上述连接池的工作方式可以实现连接的重复使用,主要目的是为了提高效率。

2.手动实现一个数据库连接池

public class MyConnectionPool4 {
    // 初始化大小
    static int INIT_SIZE = 0;
    static int MIN_SIZE = 0;
    static int INCREMENT_SIZE = 0;
    // 从头部存,从尾部取
    static LinkedList<Connection> connectionList;
    static {
        // 加载配置文件
        try {
            FileInputStream in = new FileInputStream("pool.properties");
            Properties properties = new Properties();
            properties.load(in);
            String initSize = properties.getProperty("init_size");
            String minSize = properties.getProperty("min_size");
            String increment = properties.getProperty("increment");
            INIT_SIZE = Integer.valueOf(initSize);
            MIN_SIZE = Integer.valueOf(minSize);
            INCREMENT_SIZE = Integer.valueOf(increment);
        }catch (Exception ex) {
            ex.printStackTrace();
        }
        connectionList = new LinkedList<>();
        // 初始化
        addCapcity(INIT_SIZE);
    }
    // 获取连接
    public static Connection getConnection(){
        // 判断一下如果连接池里面的数量太少了,就自动扩容
        if (connectionList.size() < MIN_SIZE) addCapcity(INCREMENT_SIZE);
        Connection connection = connectionList.removeLast();
        return connection;
    }
    // 返回连接
    public static void returnConnection(Connection connection){
        connectionList.addFirst(connection);
    }
    // 扩容的方法
    public static void addCapcity(int size){
        if (size <= 0) return;
        for (int i = 0; i < size; i++) {
            // 1. 获取连接
            Connection connection = JDBCUtils.getConnection();
            // 2. 把获取到的连接放到connectionList中
            connectionList.addFirst(connection);
        }
    }
}

我们不需要花很多时间去手动实现一个数据库连接池,因为别人或者其他公司已经造了这个轮子,我们不需要重复造轮子,所以我们在数据库连接池中。 您需要学习使用其他第三方开源数据库连接池。

3.第三方开源数据库连接池

在说这三个开源数据库连接池之前,先说明一下,JDBC其实是为数据库连接池定义了一个接口,叫做javax.sql.Datasource

public interface DataSource  extends CommonDataSource, Wrapper {
	Connection getConnection() throws SQLException;
	
	Connection getConnection(String username, String password)
    throws SQLException;
}

我们发现这个数据库连接池的接口只定义了获取连接的方法,并没有定义返回连接的方法。 那么为什么没有定义返回连接的方法呢?

因为即使定义了返回连接的方法数据库怎么停止,返回连接的方法也必须在数据库连接池的一些实现类中实现,但是作为数据库连接池的开发者数据库怎么停止,即使返回连接的方法是定义了,没有办法阻止数据库连接池的用户先关闭连接,再调用返回连接的方法。

在这里插入图片描述

3.1 DBCP

在这里插入图片描述

3.2 C3P0

在这里插入图片描述

使用

public class C3p0Utils {
    static DataSource dataSource;
    static {
		
        // 这个地方为什么没有要求我们传入配置文件呢?
        // 因为C3p0的开发者已经帮助我们把src/c3p0-config.xml 配置文件读取了
        // 所以我们在使用c3p0的时候,配置文件是有名字和位置的要求的
        dataSource = new ComboPooledDataSource();
    }
    // 获取连接
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

3.3 德鲁伊