如何设计一款高性能的数据库连接工具?过来看这里,这是一款号称拥有“光”一样链接速度的工具,我们看它是怎样实现的(第一节:数据库链接技术发展)

1.背景

        数据库连接性能的好坏,直接影响了整个程序的性能,特别是在程序高并发的情况下。在业务功能开发的时候,在编码过程中,往往更多的精力关注的是业务逻辑是否闭环,如何提高业务逻辑的效率。但是在我进行开发模板的制作过程中,逐渐从业务逻辑转换为底层架构思维,如何让架构的效率提升,这是我最近做底层架构过程中非常关注的要点。

2.方案分析

        可能很多同学在开发过程中用过各种各样的数据库连接工具,包括直接的JDBC、JNDI、Druid等工具,但我今天选取的是一款号称拥有“光”一样链接速度的工具Hikari——hikari,日语中“光”的意思,作者为这个数据库连接池命名为光,寓意是像光一样快。在分析hikariCP之前简单介绍下JDBC和数据库连接池。
 

3.接下来我们看一下数据库连接技术发展历程

        大家初次接触Hikari,惊呼它为什么有如此高的性能,能创建如此连接器的人堪称“天才”。如果你持续关注JDBC历史发展过程,那么出现Hikari类似的技术也是必然的,接下来,我们首先从JDBC一步一步了解

3.1 传统的JDBC

        传统的JDBC连接,在代码开发中只需要引入对应的驱动jar包,以MySQL为例这个jar包封装好了与MySQL服务器连接的协议,通过编写代码就可以实现,链接数据库、以及对数据库的CURD操作了

Java实现代码

try {
    // 初始化驱动类com.mysql.jdbc.Driver
    Class.forName("com.mysql.jdbc.Driver");
    // 获取connection连接
    conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8","root", "admin");

    // 查询
    sql = "select * from test"
    pstmt = (PreparedStatement) conn.prepareStatement(sql);
    rs = (ResultSet) pstmt.executeQuery();
    // 后续将ResultSet转化为对象返回...
} catch (ClassNotFoundException e) {                
    e.printStackTrace();
}catch (SQLException e) {                           
    e.printStackTrace();
}

 代码分析:

1.加载驱动类

2.通过DriverManager建立与数据库的链接

3.执行对应的SQL语句

问题:

        这里面第二步通过DriverManager建立与数据库的链接,它会耗费大量的资源和时间,核心资源消耗,:TCP层会经历3次握手+MySQL认证。一般一个应用会有很多的数据库访问,如果:代码在循环体内进行数据库访问,或者在高并发处理请求的时候。我们就会发现这个步骤,它是重复的过程。其次:业务自己建立链接需要及时进行关闭,如果不及时关闭,会产生大量的JDBC连接资源,只用了一次且没有被及时回收,会导致JVM的GC,综合以上原因,业务代码自主创建数据库连接是不合适的方案。

面对如上的性能问题,就有了连接池技术的出现

3.2.连接池技术

        通过数据库连接池技术,可以很好的解决上面的问题,连接池主要完成了如下工作:

  • 在连接应用启动的时候建立连接,并且保存到Java的容器或自定义的容器中维护
  • 在应用运行的过程中,间歇性测试连接的可用性(select 1),踢出不可用的连接,加入新的连接
  • 在应用结束后关闭JDBC连接

        Spring-JDBC,它将JDBC使用上存在大量可以封装起来的功能(connection的获取、构造PreparedStatement、connection的回收等)。总之,Spring-JDBC通过对JDBC的封装,简化了SQL的执行步骤,我们只需要输入sql语句,框架会输出sql的执行结果(类似于mysql-client控制台的效果)。

        逻辑分析:Spring-JDBC等框架封装JDBC连接获取,prepareStatement赋值,JDBC连接的释放,使用者就只需要写好sql,调用Spring-JDBC提供的JdbcTemplate类封装的方法,等待获取结果即可。

        JdbcTemplate类会通过Spring依赖注入等方式设置好它的dataSource属性,而这个dataSource就是一个数据连接池(Connection Pool,CP),CP通过选择合适的数据结构来动态维护着与MySQL的Jdbc连接。整个封装起来对使用者来说无需感知,只需要知道输入SQL语句和输出结果就好。

回顾一下

        本小结分析了数据库发展的流程和问题,从原始的直接连接数据库,到连接池技术,不仅解决了不断创建和销毁数据库连接的问题,而且还提升了数据库连接性能。下一节我们具体分析Hikari-一款高性能链接工具


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scalzdp

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值