使用Spring Data Cassandra缓存的预备语句

今天,我有一篇简短的文章,内容涉及在Spring Data Cassandra中使用Prepared Statements。 Spring为您提供了一些实用程序,使您可以更轻松地使用“预备语句”,而不必依靠自己使用Datastax Java驱动程序手动注册查询。 Spring代码提供了一个缓存来存储经常使用的准备好的语句。 允许您通过缓存执行查询,缓存可以从缓存中检索准备好的查询,也可以在执行之前添加一个新查询。

为了简短起见,我们可能应该开始看一些代码。

依存关系

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-cassandra</artifactId></dependency>
</dependencies>

使用Spring Boot 2.0.5.RELEASE将拉入Spring Data Cassandra的2.0.10.RELEASE

使用准备好的语句

让我们直接进入:

@Repository
public class PersonRepository extends SimpleCassandraRepository<Person, PersonKey> {private final Session session;private final CassandraOperations cassandraTemplate;private final PreparedStatementCache cache = PreparedStatementCache.create();public PersonRepository(Session session,CassandraEntityInformation entityInformation,CassandraOperations cassandraTemplate) {super(entityInformation, cassandraTemplate);this.session = session;this.cassandraTemplate = cassandraTemplate;}// using ORMpublic List<Person> findByFirstNameAndDateOfBirth(String firstName, LocalDate dateOfBirth) {return cassandraTemplate.getCqlOperations().query(findByFirstNameAndDateOfBirthQuery(firstName, dateOfBirth),(row, rowNum) -> cassandraTemplate.getConverter().read(Person.class, row));}private BoundStatement findByFirstNameAndDateOfBirthQuery(String firstName, LocalDate dateOfBirth) {return CachedPreparedStatementCreator.of(cache,select().all().from("people_by_first_name").where(eq("first_name", bindMarker("first_name"))).and(eq("date_of_birth", bindMarker("date_of_birth")))).createPreparedStatement(session).bind().setString("first_name", firstName).setDate("date_of_birth", toCqlDate(dateOfBirth));}private com.datastax.driver.core.LocalDate toCqlDate(LocalDate date) {return com.datastax.driver.core.LocalDate.fromYearMonthDay(date.getYear(), date.getMonth().getValue(), date.getDayOfMonth());}// without ORMpublic List<Person> findByFirstNameAndDateOfBirthWithoutORM(String firstName, LocalDate dateOfBirth) {return cassandraTemplate.getCqlOperations().query(findByFirstNameAndDateOfBirthQuery(firstName, dateOfBirth),(row, rowNum) -> convert(row));}private Person convert(Row row) {return new Person(new PersonKey(row.getString("first_name"),toLocalDate(row.getDate("date_of_birth")),row.getUUID("person_id")),row.getString("last_name"),row.getDouble("salary"));}private LocalDate toLocalDate(com.datastax.driver.core.LocalDate date) {return LocalDate.of(date.getYear(), date.getMonth(), date.getDay());}
}

这里有相当数量的样板代码,因此我们可以访问Spring Data的ORM。 我还提供了代码来演示如何在不使用ORM的情况下实现相同的目标(无论如何,直接将查询直接映射到对象)。

让我们更仔细地研究一种方法:

public List<Person> findByFirstNameAndDateOfBirth(String firstName, LocalDate dateOfBirth) {return cassandraTemplate.getCqlOperations().query(findByFirstNameAndDateOfBirthQuery(firstName, dateOfBirth),(row, rowNum) -> cassandraTemplate.getConverter().read(Person.class, row));
}private BoundStatement findByFirstNameAndDateOfBirthQuery(String firstName, LocalDate dateOfBirth) {return CachedPreparedStatementCreator.of(cache,select().all().from("people_by_first_name").where(eq("first_name", bindMarker("first_name"))).and(eq("date_of_birth", bindMarker("date_of_birth")))).createPreparedStatement(session).bind().setString("first_name", firstName).setDate("date_of_birth", toCqlDate(dateOfBirth));
}

CachedPreparedStatementCreator完全按照其说的进行操作...它创建缓存的Prepared Statements。 of方法采用实例化Bean时定义的cache ,并创建第二个参数定义的新查询。 如果查询是最近已经注册的查询,即它已经在缓存中。 然后,从那里开始查询,而不是完成注册新语句的整个过程。

传入的查询是一个RegularStatement ,可以通过调用createPreparedStatement将它转换为PreparedStatement (我猜是吧)。 现在,我们可以将值绑定到查询,因此它实际上可以做一些有用的事情。

就缓存Prepared Statements而言,这就是您要做的全部。 还有其他方法可以执行此操作,例如,您可以手动使用PreparedStatementCache或定义自己的缓存实现。 无论您的船浮在水上。

您现在已经到了这篇简短文章的结尾,希望它实际上包含了足够有用的信息……

在本文中,我们介绍了如何使用CachedPreparedStatementCreator创建和将Prepared Statements放入高速缓存中,以便在以后更快地执行。 使用Spring Data提供的类,我们可以减少需要编写的代码量。

这篇文章中使用的代码可以在我的GitHub上找到 。

如果您认为这篇文章有帮助,可以在Twitter上@LankyDanDev关注我,以跟上我的新文章。

翻译自: https://www.javacodegeeks.com/2018/10/cached-prepared-statements-cassandra.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

域名是如何被墙的_如何快速搭建属于自己的个性网站?

说明一直以来都是用GithubPage搭建的博客&#xff0c;因为服务器在国外&#xff0c;访问速度一直比较慢&#xff0c;再后来有一批服务器被墙掉了导致国内网络环境直接无法访问。这里可以多说一句&#xff0c;GithubPage跟Github用的可以不是同一IP地址服务器&#xff0c;被墙很…

linux内核函数open源码,open()在Linux内核的实现(1)-基本实现

原标题&#xff1a;open()在Linux内核的实现(1)-基本实现1.基本说明在用户态使用open()时&#xff0c;必须向该函数传入文件路径和打开权限。这两个参数传入内核后&#xff0c;内核首先检查这个文件路径存在的合法性&#xff0c;同时还需检查使用者是否有合法权限打开该文件。如…

php禁止代理ip访问_php禁止某ip或ip地址段访问的方法

本文实例讲述了php禁止某ip或ip地址段访问的方法&#xff0c;分享给大家供大家参考。具体分析如下&#xff1a;因为还没有深入学习Apache和nginx 所以用PHP写了一个可以禁用地址的小程序使用时只需&#xff1a;即可禁用单个ip如下&#xff1a;//禁用ip地址$ip$_SERVER["RE…

嵌入式linux图形系统设计,轻量级嵌入式Linux图形系统设计与实现

摘要&#xff1a;图形用户界面(GUI)是人机交互界面(MMI)的重要表现形式,它不仅提供了丰富的图像信息,而且提高了用户同嵌入式设备的交互效率。随着嵌入式技术的广泛应用和嵌入式硬件的快速发展,人们对嵌入式设备的需求日益增多,嵌入式图形用户界面的作用也越来越重要。 大多数嵌…

无服务器-构建现代应用程序的新方法

对无服务器/功能即服务/云功能技术感到好奇&#xff0c;但是还没有机会深入研究&#xff1f; 想知道所有的兴奋是什么&#xff1f; 无服务器并不意味着没有服务器。 这是构建现代应用程序的新方法。 观看此视频&#xff0c;以了解有关构建现代应用程序的这种新方法的更多信息。…

linux 查看其他磁盘分区,Linux 查看磁盘分区.pdf

Linux 查看磁盘分区作者&#xff1a;北南南北来自&#xff1a;LinuxSir.Org的&#xff0c;不仅仅是查看磁盘的分区表&#xff0c;而且也能进行磁盘分区的操作&#xff1b;但在本文&#xff0c;我们只讲磁盘分区的查看&#xff0c;以及分区的使用情况的查看&#xff1b;本文只是…

python 对象锁_也许你对 Python GIL 锁的理解是 错的。

摄影&#xff1a;产品经理甜白与草莓更配~我刚到现在这个公司时&#xff0c;听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说&#xff1a;Python 有 GIL 锁&#xff0c;所以它的多线程实际上是单线程&#xff0c;所以写多线程代码不用考虑线程冲突&#xff0c;不用加…

linux下强制取消nfs挂载目录,强制卸载无响应的nfs挂载目录

强制卸载无响应的nfs挂载目录在日常的运维中, 经常有需要使用 nfs 挂载远程服务器目录的需求, 但是照我个人实际使用的经验来看, nfs 并不是"一劳永逸", 故障率还是蛮高的, 其中最长遇到的就是由于网络原因/远程 nfs 服务器原因或其他原因导致的 nfs 客户端与 nfs 服…

animals中文谐音_Animals谐音歌词,Maroon5《animals》英语歌曲中文音译

歌词谐音&#xff1a;Maroon 5《Animals(野性)》-音吧网英语歌曲谐音歌词中文音译原创词&#xff1a;本尼布兰克曲&#xff1a;亚当莱文&#xff0c;本尼布兰科&#xff0c;谢尔贝克&#xff0c;史奇雷克斯所属专辑&#xff1a;《冰雪奇缘》电影原声带音吧网-www.yinbawang.com…

服务性服务–服务到服务的通话

在上一篇文章中&#xff0c;我介绍了如何使用Knative的 Serving功能来运行示例Java应用程序。 这篇文章将介绍部署两个应用程序的步骤&#xff0c;其中一个应用程序调用另一个。 样品细节 整个示例可在我的github存储库中找到– https://github.com/bijukunjummen/sleuth-webf…

linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现

在目前以IPv4为支撑的网络协议上搭建的网络环境中&#xff0c;SYN Flood是一种非常危险而常见的DoS攻击方式。到目前为止&#xff0c;能够有效防范SYN Flood攻击的手段并不多&#xff0c;而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明…

maya中英文对比_maya中英文对照表

1File文件New Scene建立新场景Open Scene打开场景Save Scene存盘场景Save Scene As改名存盘Import导入Export All导出所有Export Selection导出选定物体View Image查看图片View Sequence浏览顺序Create Reference引入场景文件Reference Editor引入场景编辑器Project项目New建立…

linux vmcore 分析,crash分析vmcore

然后进入 /var/crash/ 找到相应的vmcore执行crash 127.0.0.1-2014-01-21-23\:36\:14/vmcore /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinux输出如下&#xff1a;KERNEL: /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinuxDUM…

用置换破坏您的JUnit5测试

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。 在本文中&#xff0c;我将使用Java流ORM Speedment&#xff0c;因为它包含一个现成的Permutation类&#xff0c;从而帮助我节省了开发时间。…

es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法

【Object.keys()】ES5 引入了Object.keys()方法&#xff0c;返回一个数组&#xff0c;成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名var obj { foo: bar, baz: 42 };console.log(Object.keys(obj));// ["foo", "baz"]ES2017 引入了跟…

servlet异步_如何使用异步Servlet来提高性能

servlet异步这篇文章将描述一种性能优化技术&#xff0c;该技术适用于与现代Web应用程序相关的常见问题。 如今的应用程序不再只是被动地等待浏览器发起请求&#xff0c;而是希望自己开始通信。 一个典型的示例可能涉及聊天应用程序&#xff0c;拍卖行等–共同点是这样一个事实…

mysql锁机制 php_MySQL锁机制和PHP锁机制

模拟准备--如何模拟高并发访问一个脚本&#xff1a;apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本例如&#xff1a;cmd&#xff1a; apache安装路径/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php【切入正题】MYSQ…

怎么安装红旗Linux5,如何用硬盘安装红旗LINUX5_0.doc

如何用硬盘安装红旗LINUX5_0如何用硬盘安装红旗LINUX5_0本文由xinbing9贡献红旗linux5.0安装教程相信大家都和我一样,在一开始知道linux的系统时充满了神秘感.习惯了windows的我们对另一种操作系统非常好奇.正是这种好奇心,我决定装linux.看看到底有什么东东.第一次装时,大略的…

企业应用程序开发框架的分类

如果您使用的是“最佳Java框架”&#xff0c;那么您很可能会迷失本文 &#xff0c;它对Java Enterprise世界中的情况进行了很好的概述。 但是&#xff0c;从我的角度来看&#xff0c;它缺少一件非常重要的事情–对上述框架进行分类。 让我们看看这个生态系统的另一个角度&…

投资最重要的事读后感_《投资最重要的事》读书笔记分享

1、学习第二层次思维。在投资的零和世界中参与竞争之前&#xff0c;你必须先问问自己是否具有处于上半部分的充分理由。要想取得超过一般投资者的成绩&#xff0c;你必须有比群体共识更加深入的思考。你具备这样的能力吗&#xff1f;是什么让你认为自己具有这样的能力&#xff…