联通光纤限制连接数

jOOQ是在Java中执行SQL的好方法,而Quasar光纤带来了大大提高的并发性

我们很高兴在平行世界的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子。

Parallel Universe开发了一个开放源代码堆栈,使开发人员可以轻松地在JVM上对极端的并发应用程序进行编码。 使用Parallel Universe堆栈,您可以构建与现代硬件协调工作的软件,而不必动fight动脑,同时保持您的编程语言和简单,熟悉的编程风格。

Fabio Tudone开发和维护Quasar集成模块,这是Comsat项目的一部分。 在加入Parallel Universe团队之前,他参与了基于云的企业内容治理平台的开发工作,并领导了几年的开发工作。在整个职业生涯中,他一直在编写JVM软件。 他的兴趣包括Dev和DevOps实践,可伸缩性,并发和功能编程以及运行时平台。 他自然好奇,喜欢探索,他喜欢从人,地方和文化中收集知识和理解。 他还对意识练习感兴趣,喜欢写各种各样的东西。

Quasar作为Comsat项目的一部分,具有JDBC和jOOQ的集成,因此让我们来看看它的内部。

JDBC,jOOQ和Quasar

comsat-jdbc提供了JDBC API的光纤阻塞包装程序,因此您可以在光纤而不是常规Java线程中使用连接。

为什么要这么做? 因为光纤是轻量级线程,并且与正在运行的JVM中的线程相比 ,您可以拥有更多的光纤。 “更多”意味着我们要说的是数百万人,而不是数千人。

这意味着在等待JDBC执行时,您的系统中有更多的并行能力来并行执行其他操作,无论是并发/并行计算(例如在高度可靠的类Quasar Erlang类actor系统中 交换actor消息 )阻止I / O(例如, 服务 Web 请求 , 调用微服务 ,通过光纤NIO读取文件或访问其他启用光纤的数据源(如MongoDB ))。

如果您的数据库能忍受它,而更多的常规线程不会使您的系统崩溃(甚至),您甚至可以增加光纤JDBC池(请参阅附加点:后面的等待线 )并发送更多并发的jOOQ命令。

由于jOOQ使用JDBC连接访问数据库,因此在光纤上运行jOOQ就像引入comsat-jooq依赖项并将启用光纤的JDBC连接传递到jOOQ上下文一样简单:

import java.sql.Connection;
import static org.jooq.impl.DSL.*;// ...Connecton conn = FiberDataSource.wrap(dataSource).getConnection();
DSLContext create = DSL.using(connection);// ...

当然,您也可以将ConnectionProvider配置为从FiberDataSource获取连接。

从这一刻起,您可以使用常规的jOOQ,一切都会在光纤阻塞模式下发生,而不是在线程阻塞下发生。 而已。

不,真的, 绝对没有其他东西了:您将继续使用出色的jOOQ,仅使用效率更高的光纤而不是线程。 Quasar是一个好公民,不会强迫您使用新的API(特别是当原始API很好时,这很好)。

由于JVM 目前不支持可用于实现轻量级线程的本机绿色线程或延续 ,因此Quasar通过字节码检测实现了延续(以及它们之上的光纤)。 这可以在编译时完成,但是使用Quasar的代理通常更方便(尤其是在检测第三方库时),因此这是一个基于Dropwizard的Gradle示例项目 ,其中还包括Quasar代理设置(不要忘了Capsule ,这是一种非常出色的Java部署工具,可满足各种需求,这无疑使使用Quasar和代理变得轻而易举。 该示例未使用所有的jOOQ功能,而是属于SQL构建用例 (用于查询和CRUD),但是建议您对其进行更改以适合您的需求。 without-comsat分支包含一个线程阻止版本,因此您可以比较并查看与Comsat版本的(最小)差异。

排队等候在哪里?

您可能现在想知道:好的,但是JDBC是一个线程阻塞 API,Quasar如何将其转换为光纤 阻塞 API? 因为JDBC没有异步模式,所以Quasar在后台使用线程池,光纤在该线程池中分派JDBC操作,并且在JDBC操作完成后将其解冻并安排恢复(有关更多信息,请参阅Quasar的集成模式)信息)。

是的,这是讨厌的等待行 :等待线程池执行的JDBC命令。 尽管您并未将数据库并行性提高到超过JDBC线程池的大小,但是即使您仍在使用简单且熟悉的阻塞API,也不会损害光纤。 您仍然可以拥有数百万条纤维。

是否可以改善总体状况? 没有标准的异步Java RDBMS API,我们将无能为力。 但是,如果数据库是您的瓶颈,那么这可能根本不重要。 关于此主题,有好几篇不错的文章和讨论 ,该论据等于确定您要将等待线移到哪里。

好处:巧妙的jOOQ集成在幕后

目前,Quasar需要开发人员(或集成商)告诉它要进行检测的内容,尽管正在进行自动检测(此功能取决于Java 9之前不会发布的一些较小的JRE更改)。 如果您可以方便地更改源代码(或已编译的类),则可以使用@Suspendable注释方法,或者让它们throws SuspendExecution @Suspendable便足够了,但是库通常不是这种情况。 但是可以在META-INF/suspendablesMETA-INF/suspendable-supers中分别列出具有要检测的固定名称的方法,分别用于可以具有可挂起实现的具体方法和抽象/接口方法。

如果有很多(或涉及代码生成),则可以编写SuspendableClassifier随集成一起提供,并在Quasar的SPI中注册它以提供其他检测逻辑(请参见jOOQs )。 SuspendableClassifier的工作是在检测阶段检查有关运行时类路径中每个方法的签名信息,并确定该方法是否可挂起,是否可以挂起,是否可以实现或不确定。 (其他一些分类器稍后可能会说“可悬浮”或“可悬浮-超级”)。

总结一下

好吧……只需享受高效纤维上的出色jOOQ!

翻译自: https://www.javacodegeeks.com/2015/06/querying-your-database-from-millions-of-fibers-rather-than-thousands-of-threads.html

联通光纤限制连接数

联通光纤限制连接数_从数百万个光纤(而不是数千个线程)中查询数据库相关推荐

  1. 从数百万个光纤(而不是数千个线程)中查询数据库

    jOOQ是在Java中执行SQL的好方法, Quasar光纤带来了大大提高的并发性 我们很高兴在平行宇宙的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子. Parallel U ...

  2. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速

    有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...

  3. 数百万台车联网设备同时在线 0 故障,中瑞集团的云原生探索之路

    简介: 在保持对业界趋势调度关注的同时,始终选用最适合自身的技术,这可能是中瑞能在车联网领域引领行业的重要原因之一,正如中瑞CTO所说"阿里云云原生产品体系带给我们的,不是单纯的IT工具,而 ...

  4. 数百万台车联网设备同时在线0故障,中瑞集团的云原生探索之路 | 云原生Talk

    简介: 在保持对业界趋势调度关注的同时,始终选用最适合自身的技术,这可能是中瑞能在车联网领域引领行业的重要原因之一,正如中瑞CTO所说"阿里云云原生产品体系带给我们的,不是单纯的IT工具,而 ...

  5. 将student表中的数计学院的学生信息插入到stu表中。数据库批量插入

    将student表中的数计学院的学生信息插入到stu表中. 提示:请使用INSERT语句作答,stu数据表已存在,结构同student一样. 代码: insert into stu select * ...

  6. 微信小程序云函数中查询数据库时使用_.or时报错

    最开始的代码 一开始想使用 或 条件来查询数据库,照着官方文档的示例使用了 _.or,可是一直出现报错. 报错内容如下: 下面是最开始的问题代码: const cloud = require('wx- ...

  7. 3中查询数据库连接数

    SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (   SELECT    [DBID]   FROM    [Master]. ...

  8. lambd 创建线程_连接到Qt信号的Python lambda函数在其他线程中创建时不运行

    好吧,我弄清楚了发生了什么的一些细节.这仍然是一个部分的答案,但我认为它更适合作为一个答案,而不是更新问题.在 我最初的问题似乎是正确的,即slot链接到它们的实例对象的QObject事件循环(thr ...

  9. 如何使用mysql建立项目_【dbForge Studio for MySQL入门教程】如何在项目中使用数据库对象和如何使用项目构建配置...

    重命名数据库对象 要从项目重命名对象,请执行以下步骤: 1. 在" Schema View "窗口中右键单击该对象. 2. 从快捷菜单中选择" Rename " ...

最新文章

  1. PyramidBox笔记
  2. Linux命令- echo、grep 、重定向、1>2、2>1的介绍
  3. 你绝对想不到R文件找不到(cannot resolve symbol R)的原因
  4. GMaps.js - 轻松集成Google Maps的jQuery插件
  5. bzoj 1312: Hard Life 01分数规划+网络流
  6. Android 四大组件学习之Server一
  7. struts2拦截器interceptor的三种配置方法
  8. Android和iPhone浏览器大战,第1部分,WebKit抢救
  9. 电脑(笔记本/台式)如何关闭UAC
  10. 修改CSDN博文中默认的图片水印
  11. ROS从入门到精通3-5:blender机器人模型定制皮肤贴图
  12. 论文阅读:(NIPS 2021)NeRV: Neural Representations for Videos
  13. 阿里云-视频点播服务API调用
  14. S@Kura的PHP进阶之路(五)
  15. (旧)springboot 快速实现登录、注册功能(附Demo源码)
  16. 20个创意的产品包装设计
  17. c语言间隔符号的作用,C语言教学(二)常见的符号
  18. java wtc_通过Java来调用WTC服务 | 学步园
  19. Nexus概述- Nexus 简介、安装管理操作
  20. 计算机二级小蒋在教务处负责学生成绩,小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区..._考试资料网...

热门文章

  1. 牛客国庆集训派对day6TJ-DefenseTower【贪心】
  2. P3914-染色计数【树形dp】
  3. 欢乐纪中A组周六赛【2019.3.30】
  4. P3891-[GDOI2014]采集资源【背包,dp】
  5. ssl1597-石子合并问题【区间dp练习】
  6. CVPR19 基于图卷积网络的多标签图像识别模型 论文笔记
  7. 12、数据库的设计范式
  8. 31、JAVA_WEB开发基础之servlet(2)
  9. Oracle入门(十四.3)之创建PL / SQL块
  10. 关于Java序列化你应该知道的一切