高性能:MYSQL异步客户端

实时必须

实时处理领域,当需要使用外部存储数据染色的时候,需要慎重对待,不能让与外部系统之间的交互延迟对流的整个进度取决定性的影响。

同步的与数据库交互需要等待一个请求从发起到结束才能发起下次请求,等待过程是非常浪费函数时间的。

与数据库异步交互,意味着单个函数实例可以并发处理很多请求,同时并发接收响应。那么,等待时间由于发送其它请求和接收其它响应,被重复使用而节省了。至少,等待时间在多个请求上被摊销。这就使得很多使用案例具有更高的吞吐量。

浪尖在这里推荐这个jdbc异步访问客户端的主要目的是昨天发了一篇flink异步IO的文章

Flink异步IO第一讲

这个异步IO是实现高性能维表的一种方案,而今天要说的这个jdbc客户端也是其中比较重要的一个环节。

Vert.x JDBC client客户端的github地址

https://vertx.io/docs/vertx-jdbc-client/java/

使用该客户端要加入的maven依赖配置到pom.xml文件中

<dependency> <groupId>io.vertx</groupId> <artifactId>vertx-jdbc-client</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>3.5.2</version> </dependency>

大多数情况下可能是希望在多个客户端实例中共享数据源。

例如,通过创建多个实例来扩展应用程序,并且希望每个实例共享相同的数据源,避免创建多个链接池。

Client

实现起来很简单,只需调用:

SQLClient client =JDBCClient.createShared(vertx, config);

第一次调用该方法确实会使用指定的配置创建一个数据源。

后续的调用会直接返回一个客户端实例,配置不会再次使用。

可以为创建的数据源指定一个名称,方式如下:

SQLClient client =JDBCClient.createShared(vertx, config, "MyDataSource");

如果使用相同的数据源名称和相同的Vert.x实例创建不同的客户端,实际上客户端会共享相同的数据源。

这种创建方式是在你希望有不同的客户端组分别去跟不同的数据库交互的时候使用。

当然了,有时候也可能是希望每个客户端实例独享一个数据源,这种客户端的创建方式也很简单。

SQLClient client =JDBCClient.createNonShared(vertx, config);

这种方式等价于每次调用客户端给一个唯一的数据源名称。

如果已经存在了一个数据源,那么也可以直接指定该数据源

SQLClient client = JDBCClient.create(vertx,dataSource);

在使用完了数据库客户端之后应该释放掉资源。共享数据源的客户端会存在一个引用计数的概念。相同数据源的最后一个引用关闭的时候,数据源才会被释放掉。

Connection

使用客户端对象的getConnection方法可以获取一个数据库链接,具体使用方式如下:

client.getConnection(res -> {

  if(res.succeeded()) {

 

   SQLConnection connection = res.result();

 

   connection.query("SELECT * FROM some_table", res2 -> {

     if (res2.succeeded()) {

 

       ResultSet rs = res2.result();

       // Do something with results

     }

   });

  }else {

   // Failed to get connection - deal with it

  }

});

SQLConnection是一个通用的接口,不仅仅适用于Vert.x客户端。

接口的介绍如下:

https://vertx.io/docs/vertx-sql-common/java/

配置

主要是介绍一下常用的配置。

provider_class :该类主要是用来管理数据库连接的。默认是

io.vertx.ext.jdbc.spi.impl.C3P0DataSourceProvider。可以覆盖该参数配置,指定自己的实现。已实现的方式多种,可以参考

https://github.com/vert-x3/vertx-jdbc-client/tree/master/src/test/java/io/vertx/ext/jdbc/spi/impl

row_stream_fetch_size : SQLRowStream的内部cache的大小,默认是128.

假设使用了C3P0的实现,也即是默认,配置参数如下:

url : 数据库连接用的URL。

driver_class : jdbc driver的类名称。

user:数据库的用户名。

password:数据库密码。

max_pool_size:连接池中最大连接数量,默认是15.

initial_pool_size:连接池中最大初始连接数量,默认是3.

min_pool_size:连接池中最小的连接数量。

max_statements:缓存的prepared statementszui 大数量,默认是0.

max_statements_per_connection:每个连接缓存的prepared statements最大的数量,默认是0。

max_idle_time: 一个连接的空闲时间超过该值,就会被关闭,默认是0,禁止超时关闭机制.

完整的案例

package bigdata.spark.DaoUtil;

import com.google.common.collect.Lists;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.jdbc.JDBCClient;
import io.vertx.ext.sql.ResultSet;
import io.vertx.ext.sql.SQLClient;
import io.vertx.ext.sql.SQLConnection;
import org.apache.flink.streaming.api.functions.async.ResultFuture;
import org.apache.flink.types.Row;

import java.util.Collections;
import java.util.List;

public class VertxMysql {
    private transient SQLClient mySQLClient;

    public void open() throws Exception {
        JsonObject mySQLClientConfig = new JsonObject();
        mySQLClientConfig.put("url", "jdbc:mysql://localhost:3306/")
                .put("driver_class", "com.mysql.jdbc.Driver")
                .put("max_pool_size", 20)
                .put("user", "root")
                .put("password", "password");

        VertxOptions vo = new VertxOptions();
        vo.setEventLoopPoolSize(10);
        vo.setWorkerPoolSize(20);
        Vertx vertx = Vertx.vertx(vo);
        mySQLClient = JDBCClient.createNonShared(vertx, mySQLClientConfig);
    }

    public void close() throws Exception {
        mySQLClient.close();
    }

    public void asyncInvoke() throws Exception {

//        JsonArray inputParams = new JsonArray();

        mySQLClient.getConnection(conn -> {
            if (conn.failed()) {
                //Treatment failures
                return;
            }

            final SQLConnection connection = conn.result();
            connection.query("SELECT * FROM some_table", res2 -> {
                if (res2.succeeded()) {

                    ResultSet rs = res2.result();
                    List<JsonObject> rows = rs.getRows();
                    for(JsonObject json : rows){
                        String id = json.getString("id");
                        String name = json.getString("name");

                        System.out.println("name : "+name + "ID : "+ id);
                    }
                    // Do something with results
                }
            });

        });
    }
}

github地址:

https://github.com/vert-x3/vertx-jdbc-client

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2018-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

MySQL安装图解

MySQL安装图解 一、MYSQL的安装 1、打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”。...

4166
来自专栏华仔的技术笔记

Block类型变量-缓存Http请求与回调

3436
来自专栏漫漫全栈路

Nginx配置文件nginx.conf详解

最近折腾Ubuntu比较多,也基本原理了Windows和IIS了,论一个软狗的堕落史。既然换到Ubuntu系统上来,勉强算个web开发人员的我当然用的最多的就...

5437
来自专栏Java架构沉思录

Java面试通关宝典(一)

前言 年后是跳槽的高峰期,相信有不少朋友已经跃跃欲试了。想要找到好工作,离不开充分的面试准备。刚好沉思君最近在网上看到一份Java面试知识点,觉得很不错,所以...

3265
来自专栏C/C++基础

DOS常用命令大全

2010-04-17 22:27:19|  分类: 电脑技术 |  标签:dos命令大全 |字号大中小 订阅

1881
来自专栏沈唁志

解决 TP3 框架 引入 Log.class.php 文件报错方法

朋友的这个问题真的很无语,可能会出现在使用 SVN 的情况下,使用 Git 进行团队开发忽略以后是不会出现这种问题的

1741
来自专栏枕边书

网页实时聊天之js和jQuery实现ajax长轮询

众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系。所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,...

5758
来自专栏Java帮帮-微信公众号-技术文章全总结

Nginx入门详解文档

Nginx入门详解文档 1 文章内容 掌握nginx+tomcat反向代理的使用方法。 掌握nginx作为负载均衡器的使用方法。 掌握nginx实现web缓存...

5009
来自专栏武培轩的专栏

HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别

HTTP协议 :Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文...

3105
来自专栏技术博文

H5缓存机制浅析

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离...

3898

扫码关注云+社区