当前位置: 首页 > 科技观察

Java开发人员需要了解的有关地理分布式数据库的知识_0

时间:2023-03-12 01:53:40 科技观察

过去七年来,我一直从事分布式系统、平台和数据库方面的工作。早在2015年,许多架构师就开始使用分布式数据库来扩展单机或服务器的边界。他们选择这个数据库是因为它的水平可扩展性,尽管它的性能仍然只能与传统的单服务器数据库相媲美。现在,随着云原生应用程序和无服务器架构的兴起,分布式数据库需要做的不仅仅是提供水平可扩展性。架构师需要能够在主要云中断期间保持可用的数据库,支持混合云部署,并为靠近客户和最终用户的数据提供服务。这就是地理分布式数据库发挥作用的地方。作为一名Java开发人员,我有两个问题:1.我应该为创建一个云原生地理分布式数据库应用付出多少努力?2.这只是对现有应用程序的快速重构还是完全重新设计/重写?工作因用例而异。但即便如此,在构建简单应用程序时,您仍可以从“入门”体验中学到很多东西。在本文中,我将分享使用YugabyteDB作为地理分布式数据库创建Java应用程序时的关键见解。您可以在GitHub上找到完整的源代码。让我们现在开始吧!数据库部署YugabyteDB提供了一个完全托管的云版本,支持AWS和GCE,类似于其他云原生数据库。作为一名开发人员,这对我来说意义重大。我只想运行一个实例,这样我就可以专注于应用程序逻辑。最后,我花了几分钟在AWS上启动一个免费实例并将连接信息复制到我的应用程序。正如预期的那样,体验流畅且快速。在编写一行代码之前我必须下载、安装和配置数据库的日子已经一去不复返了。数据库连接作为后端开发人员,我很高兴拥有一个原生使用SQL的数据库。这缩短了学习曲线并允许我重用现有逻辑。即使我使用SpringData或Micronaut,我仍然直接编写和执行SQL查询。只要YugabyteDB使用Postgres方言,我认为我的简单Java应用程序就可以通过一个很好的旧JDBC接口连接到一个正在运行的数据库实例。使用Yugabyteb,您可以在标准PostgreSQLJDBC驱动程序或具有一些性能优势的本机YugabyteJDBC驱动程序之间进行选择。我选择了后者。几分钟后,我将笔记本电脑的IP地址添加到YugabyteCloud的IP允许列表中。我还编译并启动了示例应用程序并成功连接到云实例。JDBC连接逻辑与MySQL、Postgres和其他关系数据库要求我遵循的没有什么不同。这是一个很好的迹象。YBClusterAwareDataSourceds=newYBClusterAwareDataSource();ds.setUrl("jdbc:yugabytedb://"+settings.getProperty("host")+":"+settings.getProperty("port")+"/yugabyte");ds.setUser(settings.getProperty("dbUser"));ds.setPassword(settings.getProperty("dbPassword"));//其他特定于SSL的设置。详情见源码。Connectionconn=ds.getConnection();更好的是,虽然我的测试使用了一个免费的单节点实例,但连接逻辑保持不变,即使我的数据库有60个节点跨越几个大洲。对于应用程序开发人员来说,YugabyteDB是一个单一的逻辑实例,所有与数据分区、节点间通信和分布式查询执行相关的复杂性都在幕后透明地发生。在建立基本CRUD操作的连接逻辑后,我介绍了几种通过JDBC连接的方法,创建一个示例表,然后查询和更新它的记录。这意味着我的简单Java应用程序必须尽可能简单。所以我选择了一个非常基本的用例:两个账户之间的转账。示例表是使用标准CREATETABLE命令创建的:Statementstmt=conn.createStatement();stmt.execute("CREATETABLEIFNOTEXISTS"+TABLE_NAME+"("+"idintPRIMARYKEY,"+"namevarchar,"+"ageint,"+"countryvarchar,"+"balanceint"+")");并且只填充了两条记录(足以评估介绍性体验):stmt.execute("INSERTINTO"+TABLE_NAME+"VALUES"+"(1,'Jessica',28,'USA',10000),"+"(2,'约翰',28,'加拿大',9000)");最后,在更新类似表的Postgres或MySQL和SQL查询中查询,在我的地理分布式数据库中以相同的方式工作。下面是这两个方法的完整实现:??第一个方法查询分布式记录,第二个方法使用分布式事务来一致地更新记录:结果集rs=stmt.executeQuery("SELECT*FROM"+TABLE_NAME);while(rs.next()){System.out.println(String.format("name=%s,age=%s,country=%s,balance=%s",rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5)));}}privatestaticvoidtransferMoneyBetweenAccounts(Connectionconn,intamount)throwsSQLException{Statementstmt=conn.createStatement();try{stmt.execute("BEGINTRANSACTION;"+"UPDATE"+TABLE_NAME+"SETbalance=balance-"+amount+""+"WHEREname='Jessica';"+"UPDATE"+TABLE_NAME+"设置余额=balance+"+amount+""+"WHEREname='John';"+"COMMIT;");}catch(SQLExceptione){if(e.getErrorCode()==40001){//由于并发事务试图修改同一组行,操作中止。//考虑为生产级应用程序添加重试逻辑。e.printStackTrace();}else{扔e;}}System.out.println();System.out.println(">>>>Transferred"+amount+"betweenaccounts.");}结论我很高兴确认现代地理分布式数据库的创建者保护我(应用程序开发人员)免受大多数与分布式系统相关的复杂性我在一分钟内启动了一个分布式数据库实例,作为单个逻辑实例连接,并通过熟悉的SQL和JDBC接口查询数据库。我承认我的简单Java应用程序远不是包含低级、特定于数据库的优化的实用解决方案。但是,入门与单服务器数据库一样简单,这一点很重要。您可以在GitHub上找到我的完整应用程序。我鼓励您尝试自己运行它。译者介绍杨晓娟,社区编辑,西安电子科技大学计算机专业硕士研究生,高级研发工程师,信息系统项目经理。她在Java开发方面拥有近20年的经验。在NEC、Oracle、英方从事过Oracle数据库的数据存储、数据迁移、同构/异构数据库复制工作,尤其对数据库和数据编码有深入的学习和理解。原标题:WhatJavaDevelopersNeedtoKnowAboutGeo-DistributedDatabases,作者:DenisMagda