一文读懂java之数据库连接池(数据源)

什么是java数据库连接池?
也就是数据源(DataSource),数据库连接池中可以预先创建若干数据连接对象,然后在使用的时候即可快速从池中得到数据库连接,无需再去创建,提高使用效率,节省系统开销,当连接使用完成后,调用close方法不在关闭连接,而是将连接归还到连接池。这一点有点像线程池。
太长,太官方,太抽象,不具体?
那我们来想想我们为什么需要数据库连接池?
我们知道我们每次执行DML/DQL操作的时候,都需要经历以下几步:

//1、配置mysql连接参数
String url = "jdbc:mysql:///db_num?useSSL=false";
String user = "root", password = "root";

String sql = "select * from tb_num order by num ";
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3、获得连接器
Connection conn = DriverManager.getConnection(url, user, password);
//4、获取发送器
PreparedStatement pstmt =conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

// 5、处理结果
//6、关闭资源
rs.close();
pstmt.close();
conn.close();

也就是我们每进行一次ORM操作都要写一遍上边的代码,代码冗余量很大,那么我们尝试将相同代码封装成方法,需要调用即可,来减少冗余代码。
我们定义了得到连接器con和发射器pstmt的方法,每次需要数据库连接和发送时直接调用这两个方法即可,我们发现效果不错,不用每次都写大量冗余的代码,此时我们应该想一想,是不是我们每次进行ORM操作时,每调用一次我们封装的这两个方法都需要加载驱动,而加载驱动在java中很占用内存资源,最可怕的是居然加载完驱动就执行一条sql,又将驱动关闭,又创建。。。这是家里有矿啊

    /**
     * 得到连接器
     * @return con
     */
    public static Connection getCon() {
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    }
        /**
     * 发送器
     * @param con
     * @param sql
     * @return
     */
    public static PreparedStatement getPstmt(Connection con, String sql) {
        PreparedStatement pstmt = null;
        try {
            pstmt = con.prepareStatement(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pstmt;
    }

所以最理想的情况是我们之创建一次,将所有SQL语句全部执行完,在关闭资源是最优解。那么怎么才能创建一次呢?对了,静态代码块。此处我们用到了软编码(配置文件)。

private static String url;
    private static String user;
    private static String password;
    private static String driver;

    static {
        // 创建Properties对象
        Properties prop = new Properties();
        try {
            //以流的形式加载db.properties资源文件
            prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"));
            //为属性赋值
            driver=prop.getProperty("jdbc.driver").trim();
            url=prop.getProperty("jdbc.url").trim();
            user=prop.getProperty("jdbc.user").trim();
            password=prop.getProperty("jdbc.password").trim();
            //加载驱动
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

配置文件

# 书写格式为: key=value
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///db_scott?useSSL=false
jdbc.user=root
jdbc.password=root

注:此处前缀jdbc其实只是一个标识符,没有实际意义,为的就是避免跟计算机其它系统关键字发生冲突。如:user经常会取到计算机名。
至此我们完成了创建数据库连接的代码优化。但是我们发现获取一个数据库连接仍是一个麻烦的事,而且每次创建连接都是需要等待时间的,那么我们可以提前创建一定数量来避免上述问题并简化开发。

发布了219 篇原创文章 · 获赞 352 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_42859864/article/details/103689741