通过示例了解Apache Ignite Baseline拓扑

点燃基准拓扑或BLT表示群集中的一组服务器节点,这些服务器节点将数据持久存储在磁盘上。

点燃基准拓扑

其中,N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员,这些集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的成员,但不是基准拓扑的一部分。

基线拓扑中的节点是常规服务器节点,该节点将数据存储在内存和磁盘中,并且还参与计算任务。 Ignite群集可以具有不属于基准拓扑的一部分的不同节点,例如:

  • 未使用的服务器节点点燃本地持久性以将数据持久存储在磁盘上。 通常,它们将数据存储在内存中或将数据持久保存到第三方数据库或NoSQL。 在以上等式中,节点N3或N4可能是其中之一。
  • 未存储的客户端节点共享数据。

为了更好地理解基线拓扑概念,让我们从头开始,尝试理解其目标以及它可以帮助我们解决什么问题。

像Ignite这样的数据库旨在支持大量数据存储和处理。 Ignite数据库具有高度可伸缩性和容错能力。 Ignite的这种高可伸缩性功能给数据库管理员带来了一些挑战,例如:如何管理集群? 如何正确添加/删除节点,或者添加/删除节点后如何重新平衡数据? 因为具有多个节点的Ignite群集会显着增加数据基础结构的复杂性。 让我们以Apache Ignite为例。

点燃内存模式集群的概念非常简单。 群集中没有主节点或专用节点,并且每个节点都相等。 每个节点存储分区的子集,并且可以参与分布式计算或部署任何服务。 发生任何节点故障时,其他节点将服务于用户请求,并且故障节点的数据将不再可用。 Ignite群集管理操作非常相似,如下所示:

  • 要运行集群,请启动所有节点。
  • 要扩展群集拓扑,请添加一些节点。
  • 要减少群集拓扑,请删除一些节点。

本文的某些部分摘自《 Apache Ignite》一书 。 如果您感兴趣,请查看本书的其余部分,以获取更多有用的信息。

数据自动在节点之间重新分配。 根据缓存的备份副本配置,数据分区从一个节点移动到另一个节点。

点燃基准拓扑

在持久性模式下,即使重新启动后,节点仍保持其状态。 在任何读取操作期间,将从磁盘读取数据并恢复节点状态。 因此,与内存模式不同,以持久性模式重新启动节点不需要将数据从一个节点重新分发到另一个节点。 节点故障期间的数据将从磁盘恢复。 该策略不仅为防止节点故障期间移动大量数据提供了机会,而且还减少了重启后整个集群的启动时间。 因此,我们需要以某种方式区分这些可以在重启后保存其状态的节点。 换句话说,Ignite基线拓扑提供了此功能。

点燃基准拓扑

简而言之,Ignite基线拓扑是已配置用于在磁盘上存储持久性数据的节点的集合。 基准拓扑跟踪拓扑更改的历史记录,并在恢复过程中防止群集中的数据差异。 让我们继续基线拓扑的目标:

  • 如果要重新引导节点,请避免冗余数据的重新平衡。
  • 群集重新启动后,一旦基线拓扑的所有节点都加入后,将自动激活群集。
  • 避免出现脑裂情况下的数据不一致。

Apache Ignite提供了一个命令行(CLI)工具,可用于监视和管理集群基准拓扑。 在本文中,我们将回顾使用Ignite持久性时使用此工具进行基准拓扑管理的几种常见方案。

可以在Apache Ignite分发目录的/ bin文件夹下找到./control.sh命令行脚本。 该脚本(工具)的主要目标是激活/停用和管理代表基线拓扑的一组节点。 但是,此工具是一种多功能工具,可以有效地用于监视缓存状态或检测整个集群中可能发生的任何事务锁定。

准备沙箱。 如前所述,运行该工具的脚本位于{Ignite_home} / bin文件夹中,名为control.sh。 有用于Unix(control.sh)和Windows(control.bat)的脚本版本。 出于演示目的,我将使用以下配置:

名称 描述
操作系统 MacOS,您可以选择使用Windows或Linux操作系统。
点燃版本 2.6.0或以上。
Ignite节点数 单个主机中的3个节点。
虚拟机 1.8
TCP发现 多播

步骤1 。 我们将在持久模式下的单个主机上运行三个Ignite节点。 默认情况下,Ignite在IGNITR_HOME文件夹下创建一个WORK目录,用于存储WAL存档和日志文件。 下载Ignite发行版并将其解压缩到操作系统上的3个不同目录中,例如/usr/ignite/2.6.0-s1、/usr/ignite/2.6.0-s2、/usr/ignite/2.6.0-s3 。 您应该具有类似的文件夹层次结构,如图4所示。

点燃基准拓扑

请注意,这是在单个主机上运行具有持久性启用功能的几个节点而无需任何额外配置的最简单方法。 但是,可以将Ignite配置为允许您运行具有不同WAL存档文件夹的几个Ignite节点。

第二步 。 为了启用持久性存储,我们通过Spring使用Ignite数据存储配置。 创建一个名称为ignite-book-baseline.xml的XML文件,并在其中复制以下内容。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg"><property name="cacheConfiguration"><list><bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="name" value="TestCache"><property name="atomicityMode" value="ATOMIC"><property name="backups" value="1"></property></property></property></bean></list></property><!-- Enabling Apache Ignite Persistent Store. --><property name="dataStorageConfiguration"><bean class="org.apache.ignite.configuration.DataStorageConfiguration"><property name="defaultDataRegionConfiguration"><bean class="org.apache.ignite.configuration.DataRegionConfiguration"><property name="persistenceEnabled" value="true"><property name="metricsEnabled" value="true"></property></property></bean></property></bean></property><property name="discoverySpi"><bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"><property name="ipFinder"><bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"><property name="addresses"><list><value>127.0.0.1:47500..47509</value></list></property></bean></property></bean></property></bean>
</beans>

将文件保存在文件系统中的某个位置。

第三步 。 从我们的第一个Ignite节点开始,我们将一次启动一个Ignite服务器节点。 打开终端,然后将IGNITE_HOME目录更改为您为Ignite节点1取消存档Ignite分发的文件夹。

export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s1

现在,使用以下命令启动第一个Ignite节点:

ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml

您在控制台上的输出应类似于以下内容:

ver. 2.6.0#20180710-sha1:669feacc
2018 Copyright(C) Apache Software Foundation
Ignite documentation: http://ignite.apache.org Quiet mode.
^-- Logging to file '/usr/ignite/2.6.0-s1/work/log/ignite-f0ef6ecc.0.log'
Topology snapshot [ver=1, servers=1, clients=0, CPUs=8, offheap=3.2GB, heap=1.\
^-- Node [id=F0EF6ECC-D692-4862-9414-709039FE00CD, clusterState=INACTIVE] Data Regions Configured:
^-- default [initSize=256.0 MiB, maxSize=3.2 GiB, persistenceEnabled=true]

检查控制台上显示的日志,日志消息确认我们的第一台Ignite服务器已启动并正在运行,并且已启用持久性模式。 现在,对第二个Ignite节点再次执行相同的操作。

export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s2 
ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml

此时,您可以看到2nd Ignite节点以持久性模式启动并加入了集群。 您应该在终端中看到非常相似的消息,如下所示。

[16:13:35] >>> Ignite cluster is not active (limited functionality available). Use contro\ l.(sh|bat) script or IgniteCluster interface to activate.
[16:13:35] Topology snapshot [ver=2, servers=2, clients=0, CPUs=8, offheap=6.4GB, heap=2.\ 0GB]
[16:13:35] ^-- Node [id=6DB02F31-115C-41E4-BECC-FDB6980F8143, clusterState=INACTIVE] [16:13:35] Data Regions Configured:
[16:13:35] ^-- default [initSize=256.0 MiB, maxSize=3.2 GiB, persistenceEnabled=true]

Ignite还警告说该集群尚未激活,您必须使用control.sh脚本激活该集群。 让我们激活集群并创建一些表来存储数据。

第四步 。 在激活集群之前,让我们考虑一下control.sh工具的特定功能。 control.sh脚本当前支持以下命令:

命令 描述
-启用 该命令将集群切换为活动状态。 在这种情况下,如果群集中不存在基准拓扑,则将在群集激活期间创建新的基准。 新的基准拓扑将包括集群拓扑中的所有已连接节点。
–停用 停用集群。 在这种状态下,功能有限。
-州 打印当前集群状态。
–基准 此命令旨在管理基准拓扑。 当不带任何参数使用此命令时,它将打印当前集群基准拓扑信息。 以下参数可与此命令一起使用:添加,删除,设置和版本。

要调用特定命令,请使用以下模式:

UNIX/LINUX/MacOS
$IGNITE_HOME/bin/control.sh

现在,激活集群。 运行以下命令:

$IGNITE_HOME/bin/control.sh

如果命令成功,您应该在控制台中看到以下消息。

Control utility [ver. 2.6.0#20180710-sha1:669feacc] 2018 Copyright(C) Apache Software Foundation
User: shamim 
-------------------------------------------------------------------------------- 
Cluster activated

此时,您还可以使用–state命令检查当前集群状态。 –state命令应返回一条消息,说明集群已激活。

步骤5 。 现在,创建一个表并填充一些数据。 我们使用SQLLINE工具连接到集群。 运行以下命令以启动SQLLINE工具:

sqlline.sh --color=true --verbose=true -u jdbc:ignite:thin://127.0.0.1/

创建一个名为EMP的表,然后向该表中插入1000行。 使用以下DDL脚本创建EMP表,如下所示:

CREATE TABLE IF NOT EXISTS EMP
(empno LONG, ename VARCHAR, job VARCHAR, mgr INTEGER, hiredate DATE,
sal LONG,
comm LONG,
deptno LONG,
CONSTRAINT pk_emp PRIMARY KEY (empno)
) WITH "template=partitioned,CACHE_NAME=EMPcache";

接下来,使用GitHub存储库中的EMP_001.sql脚本在表中插入1000个条目。

0: jdbc:ignite:thin://127.0.0.1/> !run /PATH_TO_THE_FILE/the-apache-ignite-book/chapters/\ chapter-10/baseline/EMP_001.sql

上面的命令将1000个条目插入EMP表或EMPcache。 使用visor CLI工具查看整个集群中缓存的大小。 在IgniteVisor控制台中运行命令cache -a。 该命令应返回以下输出,如图5所示。

点燃基准拓扑

查看名为SIZE的列。 该列阐明了每个节点中存储的条目数。 在我们的例子中,我们的一个节点包含504个条目,另一个节点包含496个条目到EMPcache缓存中。

步骤6 。 到目前为止,我们仅启动了2个Ignite节点,并在集群中创建了基线拓扑。 让我们启动另一个Ignite节点。 对第3个Ignite节点再次执行相同的操作。

export IGNITE_HOME=PATH_TO_THE_IGNITE_NODE_ONE/ignite/2.6.0-s3 
ignite.sh /PATH_TO_THE_SPRING_CONFIG_FILE/ignite/ignite-book-baseline.xml

控制台上的日志应确认您已成功在持久性模式下启动节点。 此外,您应该在控制台上收到一条警告,即本地节点不包括在基准拓扑中,并且不会用于持久数据存储。 现在我们可以使用–baseline命令了。 让我们运行不带任何参数的命令,如下所示:

$IGNITE_HOME/bin/control.sh --baseline

输出可能如下:

shamim:~ shamim$ control.sh --baseline
Control utility [ver. 2.6.0#20180710-sha1:669feacc] 2018 Copyright(C) Apache Software Foundation
User: shamim -------------------------------------------------------------------------------- Cluster state: active
Current topology version: 6
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=ONLINE ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
-------------------------------------------------------------------------------- 
Number of baseline nodes: 2
Other nodes: ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e
Number of other nodes: 1

上面的基线信息显示了群集状态,拓扑版本,具有一致ID的节点(属于基线拓扑的节点)以及不属于基线拓扑的节点。 在这里,基线节点数为2,基线由我们的第1个和第2个Ignite节点组成。

有时可能会发生在第一次集群激活期间未创建基准拓扑的情况。 在这种情况下,–baseline命令将返回“找不到基线节点”之类的消息。 在这种情况下,请停止第3个节点,并等待几秒钟。 然后使用数字集群拓扑版本手动设置基线拓扑,如下所示:

control.sh --baseline version topologyVersion

在上面的命令中,用实际的拓扑版本替换topologyVersion。 您可以在任何Ignite节点控制台中找到拓扑版本,如下所示:

Topology snapshot [ver=6, servers=3, clients=0, CPUs=8, offheap=9.6GB, heap=3.0GB]

从控制台中选择最新的拓扑快照版本。

在此阶段,第3个Ignite节点不是基线拓扑的一部分。 该节点将不用于持久数据存储。 这意味着,如果我们将创建任何新表并将数据插入其中,则该节点将不会为该新表存储任何数据。 让我们验证一下这个概念。

步骤7 。 使用以下DDL脚本创建一个新表DEPT:

CREATE TABLE IF NOT EXISTS DEPT (
deptno LONG,
dname VARCHAR,
loc VARCHAR,
CONSTRAINT pk_dept PRIMARY KEY (deptno)
) WITH "template=partitioned,CACHE_NAME=DEPTcache";

另外,使用DEPT.SQL插入100个部门。 DEPT.SQL脚本可从GitHub存储库中获得 。

0: jdbc:ignite:thin://127.0.0.1/> !run /PATH_TO_THE_FILE/github/the-apache-ignite-book/ch\ apters/chapter-10/baseline/DEPT.sql

现在,在遮阳板控制台中运行命令cache -a,应打印类似图6所示的输出。

点燃基准拓扑

上图确认了第三个节点不包含任何持久性数据。 但是,不是基线拓扑一部分的节点可以参与任何内存计算。

步骤8 。 接下来,让我们将新的空节点添加到基准拓扑中以保存持久性数据。 调用命令–baseline add

将新节点添加到现有基准中。

control.sh --baseline add 3c2ad09d-c835-4f4b-b47a-43912d04d30e

在以上命令中,将一致的ID 3c2ad09d-c835-4f4b-b47a-43912d04d30e替换为您的第三个Ignite节点的一致ID。 完成–baseline add命令后,将显示一条消息,确认新的基线拓扑包含3个节点。

Cluster state: active
Current topology version: 10
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=ONLINE 
ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e, STATE=ONLINE 
ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
-------------------------------------------------------------------------------- Number of baseline nodes: 3
Other nodes not found.

从3个节点形成新的基准拓扑后,将立即进行数据重新平衡。 新的空节点(在我们的示例中是第3个节点)将从其他节点接收其部分数据。 如果再次在Ignite Visor CLI中运行cache -a命令,则可以确认数据重新平衡。 图7显示了在基线拓扑中添加第三个节点后数据重新平衡的结果。

点燃基准拓扑

现在,每个节点几乎将条目的平均分配(约300个条目)分配给缓存EMPcache。 但是,如果基线拓扑节点之一将重新启动,将会发生什么? 让我们停止一个节点,然后尝试向表EMP中插入一些数据。

步骤9 。 按下CRTL + X键停止第二个节点。 执行不带任何参数的–baseline命令以打印基线拓扑的状态。

control.sh --baseline

上面的命令将显示当前基线拓扑状态,与下一条消息非常相似:

-------------------------------------------------------------------------------- 
Cluster state: active
Current topology version: 11
Baseline nodes:
ConsistentID=1640f655-4065-438c-92ca-478b5df91def, STATE=OFFLINE 
ConsistentID=3c2ad09d-c835-4f4b-b47a-43912d04d30e, STATE=ONLINE 
ConsistentID=d8b04bc3-d175-443c-b53f-62512ff9152f, STATE=ONLINE
-------------------------------------------------------------------------------- 
Number of baseline nodes: 3
Other nodes not found

预期脱机的节点之一。 现在,尝试通过SQLLINE工具将一些数据插入EMP表,如下所示:

insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2009, 'Sall\ ie', 'Sales Associate', 96, null, 3619, 34, 78);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2010, 'Cori\ ', 'Human Resources Manager', 65, null, 1291, 86, 57);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2011, 'Myrt\ le', 'VP Quality Control', 88, null, 5103, 21, 48);
insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (2012, 'Ches\ ', 'Desktop Support Technician', 46, null, 6352, 29, 21);

您应该注意到,一些inserts语句失败,并带有错误,该错误在下一个代码段中显示。

Caused by: class org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundExceptio\ n: Failed to map keys for cache (all partition nodes left the grid).
at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSing\ leUpdateFuture.mapSingleUpdate(GridNearAtomicSingleUpdateFuture.java:562)

发生此错误是因为我们没有EMP表的备份副本。 应该存储数据的节点已停止,并且Ignite无法存储数据。 为避免这种情况,请考虑使用一个备份的缓存/表。 如果一个节点发生故障,它将不会丢失任何数据。 目前,我们有几种选择:

  • 尽快重新启动脱机节点,以最小的停机时间来防止数据丢失。
  • 从基准拓扑中删除脱机节点并重新平衡数据。

第十步 。 让我们从基准拓扑中删除脱机节点。 执行以下命令:

Caused by: class control.sh --baseline remove 1640f655-4065-438c-92ca-478b5df91def

完成remove命令后,基线拓扑发生了变化,但停止的节点除外。 请注意,通过从基准拓扑中删除节点,您确认您将无法在重新启动该节点后使用该节点上存储的数据。 此时,在对集群进行数据操作期间不会发生任何错误。 您可以插入新条目或将现有条目成功更新到缓存中。

请注意,要从基准拓扑中删除的节点应从群集断开,然后再从基准中删除。 否则,将出现错误“无法从基准中删除节点”,指定在从基准中删除之前必须停止的节点。

除拓扑管理外,control.sh脚本还可用于监视和控制群集状态,该状态在Ignite站点中有详细记录。 因此,请参考Ignite文档的控制脚本部分以获取更多信息。

翻译自: https://www.javacodegeeks.com/2018/12/apache-ignite-baseline-topology-examples.html

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

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

相关文章

Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别

即使同时使用ContextConfiguration和SpringApplicationConfiguration批注以及SpringJUnit4ClassRunner来指定如何加载Spring应用程序上下文&#xff0c;它们之间也存在细微的差异。 尽管ContextConfiguration在加载应用程序上下文方面表现出色&#xff0c;但没有充分利用Spring…

vert.x_使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务

vert.x中断了将近半年后发表了一篇新文章。 在本文中&#xff0c;我们将快速了解如何开始使用vert.x&#xff0c;更有趣的是&#xff0c;如何使用RxJava简化异步系统的编程。 我们将涵盖以下主题&#xff1a; 使用Maven创建一个空的vert.x项目 导入IntelliJ并创建一个简单的H…

如何通过Rultor将Maven工件部署到CloudRepo

在我以前的文章中 &#xff0c;我描述了如何在Amazon S3中设置私有Maven存储库并通过Rultor进行部署。 如果您熟悉管理Amazon Web Services&#xff08;AWS&#xff09;&#xff0c; S3和AWS Identity and Access Management&#xff08;IAM&#xff09;的话&#xff0c;这是一…

java里面自行车的属性_11、Java基础知识

1、安装jdk&#xff0c;配置环境变量2、public class HelloWorld{publicstatic void main(String[] args){System.out.println(‘HelloWorld’);}}3、编译过程&#xff1a;通过javac编译java文件&#xff0c;生成.class文件&#xff0c;使用java命令运行class文件&#xff0c;注…

布线问题分支限界法java_大型布线:Java云应用程序缺少的技术

布线问题分支限界法java您是否曾经想过&#xff0c;为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务&#xff1f; 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 &#xff08;跳至第32分钟&#xff09;&#xff0c;这使我在云平台的背景下…

Spring Boot微服务,Docker和Kubernetes研讨会–第2部分

在上一篇文章中&#xff0c;我们使用SpringBoot和Docker创建了第一个微服务“ ProductService”。 在这一部分中&#xff0c;我们将详细介绍如何使用Spring Cloud&#xff0c;netflix库&#xff0c;API网关来管理多个微服务。 假设对于我们的订单管理系统&#xff0c;最小关系…

jboss5.1安全性配置_使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全

jboss5.1安全性配置企业应用程序的一个常见要求是在登录页面后面保护所有JSF页面。 有时&#xff0c;您甚至希望在应用程序内部具有保护区&#xff0c;只有拥有特定角色的用户才能访问这些保护区。 Java EE标准附带了实现受某些安全性约束保护的Web应用程序所需的所有方法。 在…

分布式事务 camel_使用Camel在Amazon上构建分布式工作流应用程序

分布式事务 camel带有SNS-SQS的管道 工作流由以动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程&#xff0c;例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了用于构建分布式和可伸缩工作流应用程序的各种工具。 构建此类应用程序的一种方法…

比较Java REST文档框架

确定在记录REST API时选择哪种Java框架可能很麻烦。 在本博文中&#xff0c;我们将简要比较我们自己使用的REST Web服务的三种文档框架&#xff0c;以及它们如何与Spring框架&#xff08;这是Foreach最常使用的Java框架&#xff09;集成。 这些是RESTful API建模语言&#xff0…

jaVa游戏三国志英杰传,《三国志英杰传》到底是怎样的一款游戏

原标题&#xff1a;《三国志英杰传》到底是怎样的一款游戏介绍作为PC平台上经典的战棋策略类游戏&#xff0c;英杰传系列可谓把这一类型游戏在战略性和资源获取上的精髓发挥的淋漓尽致。系列初代的《三国志英杰传》诞生在1995年的DOS系统上&#xff0c;虽然我接触英杰传时已经是…

jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

jvm 内存镜像开发人员&#xff1a;Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面&#xff0c;它使我们使用的库可以与我们的代码进行交互&#xff0c;而无需对其进行硬…

谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!

有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物&#xff1f; 有20亿个孩子&#xff0c;每个孩子都有自己的愿望清单&#xff0c;他会在24小时内完成。 这意味着每个孩子平均需要43微秒&#xff0c;他需要检查每个孩子是否顽皮或好。 您无需再怀疑了。 我会透露这个秘密…

php时间格式函数,PHP函数之日期时间函数date()使用详解_php基础_脚本

$ttime();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日&#xff0c;二位数字&#xff0c;若不足二位则前面补零; 如: "01" 至 "31"D - 星期几…

play框架配置 拦截器_如何使用Play框架为https配置SSL证书

play框架配置 拦截器我花了几个小时试图使它起作用&#xff0c;最后&#xff0c;问题是我自己没有使用keytool生成CSR&#xff08;证书请求&#xff09;。 当我尝试通过https访问Play时&#xff0c;我一直收到此错误&#xff1a; javax.net.ssl.SSLPeerUnverifiedException&a…

matlab 球坐标绘图,MATLAB绘制地图

1使用向量绘制地图1.1绘制全球海岸线向量数据可以表示一个地图。这种向量存在的形式是一系列的经纬度或投影坐标对&#xff0c;它们代表一个点集、一个线条或者多边形。例如&#xff0c;描绘出行政区域边界的点、公路系统、城市的中心或者以上三个集合放在一起&#xff0c;都可…

php 有 stringbuffer,String、StringBuffer、StringBulider三者介绍

三者都实现了CharSequence接口&#xff0c;因此CharSequence可认为是一个字符串的协议接口1.String类是不可变类&#xff0c;即一旦一个String对象被创建后&#xff0c;包含在这个对象中的字符序列是不可改变的&#xff0c;直至这个对象被销毁&#xff1b;我们常常定义的时候 S…

php生成网页按钮,JavaScript实现自动生成网页元素功能(按钮、文本等)_javascript技巧...

创建元素的方法&#xff1a;1、利用createTextNode()创建一个文本对象2、利用createElement()创建一个标签对象3、直接利用容器标签中的一个属性&#xff1a;innerHTML-----本质上改该标签容器中的“html代码”&#xff0c;不是我们认为的对象树的操作详解代码&#xff1a;这是…

adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列

adf 自动输稿器大家好。 继续进行ADF MySQL解决方法系列&#xff0c;今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用。 如果使用的是Oracle数据库&#xff0c;则可以使用oracle.jbo.domain.DBSequence以及序列和触发器来立即进行操作。 为简单起…

探索适用于Apache Spark的Spline Data Tracker和可视化工具(第1部分)

最近引起我注意的一个有趣且充满希望的开源项目是Spline &#xff0c;它是由Absa维护的Apache Spark的数据沿袭跟踪和可视化工具。 该项目由两部分组成&#xff1a;一个在驱动程序上工作的Scala库&#xff0c;该驱动程序通过分析Spark执行计划来捕获数据沿袭&#xff0c;并提供…

高性能mysql 聚簇索引,高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引...

一、聚集索引介绍1.什么是聚集索引&#xff1f;InnoDB’s clustered indexes actually store a B-Tree index and the rows together in the same structure.2.为什么一张表只能一个聚集索引&#xff1f;When a table has a clustered index, its rows are actually stored in …