数据库连接池-浅析

    java web应用的基础就是 连接数据库,对数据进行crud。

    那么java是如何连接 数据库的呢?那就是jdbc。使用jdbc就可以连接上我们想要的数据库。

jdbc 是什么呢?  全称:Java DataBase Connection

 用java 连接关系数据库的api,是一种接口规范,它位于java.sql包和javax.sql包里,而具体实现是各大数据库厂商,根据Jdbc编写的驱动来实现。

jdbc核心的类四个:1.DriverManager   2.Connection    3.Statement (有升级)   4.ResultSet

jdbc的具体使用:

public class DbUtil {
    public static final String url = "jdbc:mysql://localhost:3306/aaa";
    public static final String name = "liulx";
    public static final String password = "123456";

    public static void main(String[] args) throws Exception {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(url, name, password);
        //3.操作数据库,实现增删改查
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("select * from user");
        //如果有数据,rs.next()返回true
        while(rs.next()){
            System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
        }
    }
}

    第一步中加载对应数据库版本的驱动,然后通过驱动获得连接,这个连接就相当于我们使用者到数据库服务器的桥,桥修起来,我们就可以通信了,使用statement会话进行传输,使用ResultSet结果集接受返回的结果。

   jdbc核心就是者四个步骤,但是这里面存在了很多很多问题,比如说sql注入,就是在参数的位置,写入了sql语句,造成了数据库的错误解析,对数据库内容进行了非法操作,为了避免这种情况的产生,有了PreparedStatement,在sql语句中,对于非关键字部分,使用占位符来处理,这个类有预编译过程,将sql和参数,进行了分离,分离传输给数据库,这样就可以对参数进行分析,参数不能有多余的操作。

    mysql数据库每秒可以进行800次读写,但是用户在对数据库访问的时候,会先建立连接,然后在进行访问,最后还要释放连接,虽然我们访问的速度不满,但是建立连接是基于tcp,还要三次握手,是很慢的过程,所以,如果一秒钟有100个用户进行登录,那么数据库是无法进行服务的。

    问题来了,既然连接这么慢,为什么我们连接上了又要释放呢?

    因为如果不释放,那么可能存在很多很多连接,而数据库的连接是有上限的,而且连接超过数量之后,可能造成内存溢出,造成问题,数据库的连接是占了很大内存资源的,就算没有溢出,在复杂的操作过程中,可能吧内存丢失遗漏了,那么就会操作数据不安全,比如你存密码的内存块丢了,被不法分子利用了,就很不安全。所以使用之后一定要关闭连接。

参考:https://www.iteye.com/blog/tomenjoy-311350

  问题:那么我们连接又慢,但是又要提高速度怎么办?

   jdbc为我们提供了连接管理接口,让第三方来实现对连接的管理,所以有了连接池的概念,连接池的本质就是装了很多连接的容器。

  我们使用一个容器来把很多连接都装起来,要用的时候就拿一个出来使用,用完了就还回去,这样就可以避免重复的创建连接数据库。而我们的容器也可以控制连接的数量,不让其一直扩大。

  连接池不仅仅是管理connection,还要管理statement ,resultSet这些,这些同样是也宝贵的资源。

  连接池的实现原理呢?

用一个容器来装连接,在应用启动时候,初始化容器里面的连接(这个连接到数量,由用户来确定), 连接初始化好了,就是使用和还回来了,我们怎么知道一个连接是在使用,还是空闲呢?在jdbc提供的connection中,是没有标识符的,所以我们要封装connection,拿出一个新的连接,给这个连接加上新的成员,是否空闲的标识符。然后用户就可以根据连接的状态来获取连接了,也可以避免重复建立连接。一切交给连接池来管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值