提交 4d495e4b 编写于 作者: W wizardforcel

2020-06-03 23:45:18

上级 368ff31e
......@@ -39,7 +39,7 @@ Sun 提供了 JDBC-ODBC 桥驱动:`sun.jdbc.odbc.JdbcOdbcDriver`。 该驱动
2 类 JDBC 驱动类似于 1 类 驱动,不同之处在于 **ODBC 部分被替换为本地代码部分**。 本机代码部分针对特定的数据库产品,即使用数据库产品的客户端库。 驱动将 JDBC 方法调用转换为数据库本机 API 的本机调用。
这种体系结构消除了对 ODBC 驱动的需要,而直接称为数据库供应商提供的本机客户端库。 数据库供应商很快就采用了这种方法,因为它可以快速,廉价地实现,因为他们可以重用现有的基于 C/C++ 的本机库。
这种构消除了对 ODBC 驱动的需要,而直接称为数据库供应商提供的本机客户端库。 数据库供应商很快就采用了这种方法,因为它可以快速,廉价地实现,因为他们可以重用现有的基于 C/C++ 的本机库。
## 类型 3:所有 Java + 中间件翻译驱动
......@@ -57,7 +57,7 @@ JDBC 4 类驱动,也称为直接数据库纯 Java 驱动,是一种数据库
4 类驱动完全用 Java 编写,因此与平台无关。 它们安装在客户端的 Java 虚拟机中。 它提供了比 1 类和 2 类驱动更好的性能,因为它没有将调用转换为 ODBC 或数据库 API 调用的开销。 与 3 类驱动不同,它不需要关联的软件即可工作。
体系结构将整个 JDBC API 实现以及用于直接与数据库通信的所有逻辑封装在单个驱动中。 通过在 100% java 程序包中都包含一个单独的层和一个小的驱动,可以轻松进行部署并简化开发过程。
构将整个 JDBC API 实现以及用于直接与数据库通信的所有逻辑封装在单个驱动中。 通过在 100% java 程序包中都包含一个单独的层和一个小的驱动,可以轻松进行部署并简化开发过程。
例如,这种类型包括广泛使用的 Oracle 瘦驱动。
......
# Java JDBC PreparedStatement 示例
# Java JDBC `PreparedStatement`示例
> 原文: [https://howtodoinjava.com/java/jdbc/how-to-execute-preparedstatement-using-jdbc/](https://howtodoinjava.com/java/jdbc/how-to-execute-preparedstatement-using-jdbc/)
在数据库管理系统中, [**预备语句**](https://en.wikipedia.org/wiki/Prepared_statement)**参数化语句**是用于高效重复执行相同或相似数据库语句的功能。 准备好的语句通常与 SQL 语句(例如查询或更新)一起使用,采用模板的形式,在每次执行期间将某些常量值替换为模板。
在数据库管理系统中, [**预备语句**](https://en.wikipedia.org/wiki/Prepared_statement)**参数化语句**是用于高效重复执行相同或相似数据库语句的功能。 预备语句通常与 SQL 语句(例如查询或更新)一起使用,采用模板的形式,在每次执行期间将某些常量值替换为模板。
A typical template would look like this: “INSERT INTO EMPLOYEE (ID, NAME) VALUES (?, ?);
Here values are set in runtime at placeholders represented by “?”.
一个典型的模板如下所示:“`NSERT INTO EMPLOYEE (ID, NAME) VALUES (?, ?);`
此处,值在运行时在以“`?`”表示的占位符处设置。
## 准备好的语句如何工作?
## 预备语句如何工作?
大多数关系数据库通过四个步骤来处理 JDBC / SQL 查询:
......@@ -16,22 +16,23 @@ Here values are set in runtime at placeholders represented by “?”.
3. 规划/优化数据采集路径
4. 执行优化的查询/获取并返回数据
对于发送到数据库的每个 SQL 查询,一个 Statement 将始终执行上述四个步骤。 **在**上面的执行过程中,Prepared Statement 预先执行步骤(1)–(3)。 因此,在创建 Prepared Statement 时,会立即执行一些预优化。 这样做的目的是减轻执行时数据库引擎的负担。
对于发送到数据库的每个 SQL 查询,一个`Statement`将始终执行上述四个步骤。 **在**上面的执行过程中,`PreparedStatement`预先执行步骤(1)–(3)。 因此,在创建`PreparedStatement`时,会立即执行一些预优化。 这样做的目的是减轻执行时数据库引擎的负担。
## 使用准备好的语句比简单的 JDBC 语句的优势
## 使用预备语句比简单的 JDBC 语句的优势
* SQL 语句的预编译和数据库侧缓存可提高整体执行速度,并能够批量重用同一 SQL 语句。
* 通过内置对引号和其他特殊字符的转义,自动防止 SQL 注入攻击。 请注意,这要求您使用任何 PreparedStatement setXxx()方法来设置值,并且不能通过字符串串联使用 SQL 字符串中的值。
* 除了以上两种主要用法外,准备好的语句还使处理诸如 BLOB 和 CLOB 之类的复杂对象变得容易。
* 通过内置对引号和其他特殊字符的转义,自动防止 SQL 注入攻击。 请注意,这要求您使用任何`PreparedStatement.setXxx()`方法来设置值,并且不能通过字符串连接使用 SQL 字符串中的值。
* 除了以上两种主要用法外,预备语句还使处理诸如 BLOB 和 CLOB 之类的复杂对象变得容易。
如果您错过了,在以前的文章中,我们了解了 [JDBC 驱动的类型](//howtodoinjava.com/java/jdbc/jdbc-basics-types-of-jdbc-drivers/ "JDBC Basics : Types of JDBC Drivers?")和一些基本操作,例如[使用 JDBC](//howtodoinjava.com/java/jdbc/jdbc-mysql-database-connection-example/ "JDBC MySQL Database Connection Example") 建立数据库连接,然后如何[执行 SELECT Query](//howtodoinjava.com/misc/jdbc-select-query-example/ "JDBC SELECT Query Example") ,然后单击 [INSET 查询示例](//howtodoinjava.com/java/jdbc/jdbc-sql-insert-query-example/ "JDBC SQL INSERT Query Example")
如果您错过了,在以前的文章中,我们了解了 [JDBC 驱动的类型](//howtodoinjava.com/java/jdbc/jdbc-basics-types-of-jdbc-drivers/ "JDBC Basics : Types of JDBC Drivers?")和一些基本操作,例如[使用 JDBC](//howtodoinjava.com/java/jdbc/jdbc-mysql-database-connection-example/ "JDBC MySQL Database Connection Example") 建立数据库连接,然后[如何执行`SELECT`查询](//howtodoinjava.com/misc/jdbc-select-query-example/ "JDBC SELECT Query Example"),然后单击[`INSERT`查询示例](//howtodoinjava.com/java/jdbc/jdbc-sql-insert-query-example/ "JDBC SQL INSERT Query Example")
![JDBC-Icon](img/353e2fc90002c7f65b66549c16f491fa.png)
**执行准备好的语句**需要执行以下步骤:
**执行预备语句**需要执行以下步骤:
1)建立数据库连接
2)设置值并执行准备好的语句
2)设置值并执行预备语句
前提条件包括至少设置数据库架构和创建表。
......@@ -61,9 +62,9 @@ connection = DriverManager
```
## 2)设置值并执行 PreparedStatement
## 2)设置值并执行`PreparedStatement`
这是帖子中的主要步骤和核心部分。 它需要创建一个 Statement 对象,然后使用其`executeQuery()`方法。
这是帖子中的主要步骤和核心部分。 它需要创建一个`Statement`对象,然后使用其`executeQuery()`方法。
```java
PreparedStatement pstmt = connection.prepareStatement(sql);
......@@ -78,7 +79,7 @@ int affectedRows = pstmt.executeUpdate();
让我们看看整个代码在工作。
## 完整的 JDBC PreparedStatement 示例
## 完整的 JDBC `PreparedStatement`示例
```java
package com.howtodoinjava.jdbc.demo;
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/](https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/)
[**Java 数据库连接(JDBC)**](//howtodoinjava.com/category/java/jdbc/ "JDBC") 是标准应用编程接口(API)的 JavaSoft 规范,允许 Java 程序访问数据库管理系统。 JDBC API 由一组用 Java 编程语言编写的接口和类组成。 使用这些标准接口和类,程序员可以编写连接数据库的应用,发送以结构化查询语言(SQL)编写的查询,并处理结果。 JDBC 面向关系数据库。
[**Java 数据库连接(JDBC)**](//howtodoinjava.com/category/java/jdbc/ "JDBC")是标准应用编程接口(API)的 JavaSoft 规范,允许 Java 程序访问数据库管理系统。 JDBC API 由一组用 Java 编程语言编写的接口和类组成。 使用这些标准接口和类,程序员可以编写连接数据库的应用,发送以结构化查询语言(SQL)编写的查询,并处理结果。 JDBC 面向关系数据库。
虽然不再标准直接在您的应用中使用 JDBC,因为我们有许多更健壮的 API 可以为我们完成这项工作,例如 [**Hiberate**](//howtodoinjava.com/hibernate-tutorials/ "hibernate")[**iBatis**](//howtodoinjava.com/ibatis/ "ibatis") 。 但是,如果由于特定的要求而仍然被您吸引,或者只是在学习它,那么下面的建议将帮助您编写更快速和有效的代码。
......@@ -22,15 +22,15 @@ Save Some Bytes On Network Traffic
对象池可以发生在两个方面:
**1)连接池:**由于在后端数据库中建立网络连接和初始化数据库连接会话会产生开销,因此创建数据库连接通常很昂贵。 反过来,连接会话初始化通常需要耗时的处理来执行用户认证,建立事务上下文以及建立后续数据库使用所需的会话的其他方面。
**1)连接池**由于在后端数据库中建立网络连接和初始化数据库连接会话会产生开销,因此创建数据库连接通常很昂贵。 反过来,连接会话初始化通常需要耗时的处理来执行用户认证,建立事务上下文以及建立后续数据库使用所需的会话的其他方面。
此外,数据库对所有连接会话的持续管理可能会对应用的可伸缩性施加主要限制因素。 基于并发连接会话的数量,诸如锁,内存,游标,事务日志,语句句柄和临时表之类的宝贵数据库资源都倾向于增加。
**启用连接池允许池管理器在关闭连接后将其保留在“池”中**。 下次需要连接时,如果请求的连接选项与池中的连接选项匹配,则将返回该连接,而不会产生与服务器建立另一个实际套接字连接的开销。
By the way, you don’t need to implement your own logic for connection pool manager. You can use some facilities provided on your server. Example: [http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html](https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html)
顺便说一句,您不需要为连接池管理器实现自己的逻辑。 您可以使用服务器上提供的某些功能。 例如:[http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html](https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html)
**2)语句池:**从 JDBC 3.0 开始,JDBC 标准定义了一个语句缓存接口。 设置 MaxPooledStatements 连接选项将启用语句池。 **启用语句池使驱动可以重新使用 Prepared Statement 对象**。 关闭 Prepared Statements 后,它们将返回到池中而不是被释放,并且从池中检索下一个具有相同 SQL 语句的 Prepared Statement,而不是针对服务器实例化和准备该语句。
**2)语句池**:从 JDBC 3.0 开始,JDBC 标准定义了一个语句缓存接口。 设置`MaxPooledStatements`连接选项将启用语句池。 **启用语句池使驱动可以重新使用 Prepared Statement 对象**。 关闭`PreparedStatement`后,它们将返回到池中而不是被释放,并且从池中检索下一个具有相同 SQL 语句的`PreparedStatement`,而不是针对服务器实例化和准备该语句。
语句缓存可以执行以下操作:
......@@ -50,11 +50,11 @@ connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/JDBCDemo",
```
在此处阅读有关语句池的更多信息: [http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm](https://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm)
在此处阅读有关语句池的更多信息:[http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm](https://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm)
## **同时考虑元数据性能**
如果要在代码中处理元数据,那么这是需要注意的另一个重要方面。 这里的第一个技巧是**使用尽可能多的参数(或过滤器)来获取**指定的元数据。 例如,不要像这样调用 getTables
如果要在代码中处理元数据,那么这是需要注意的另一个重要方面。 这里的第一个技巧是**使用尽可能多的参数(或过滤器)来获取**指定的元数据。 例如,不要像这样调用`getTables`
```java
DatabaseMetaData dbmd = connection.getMetaData();
......@@ -70,7 +70,7 @@ ResultSet rs = dbmd.getTables(null,"testDB",null,null);
```
其次,请记住**,大多数 JDBC 驱动在选择查询中返回所需数据时,会在**的提取时间填充 ResultSetMetaData 对象。 使用此信息,而不是从 DatabaseMetaData 获取数据,这是附加请求,在大多数情况下是可以避免的。
其次,请记住,大多数 JDBC 驱动在选择查询中返回所需数据时,会在提取时填充`ResultSetMetaData`对象。 使用此信息,而不是从`DatabaseMetaData`获取数据,这是附加请求,在大多数情况下是可以避免的。
```java
selectStmt = connection.createStatement();
......@@ -87,11 +87,11 @@ rsmd.getScale(0);
```
TIP : Instead of using getColumns to get data about a table, consider issuing a dummy query and using the returned ResultSetMetaData which avoids querying the system tables!
提示:可以考虑发出一个虚拟查询并使用返回的`ResultSetMetaData`来避免查询系统表,而不是使用`getColumns`获取有关表的数据!
## **仔细选择提交模式**
在编写 JDBC 应用时,请确保考虑提交事务的频率。 每次提交都会导致驱动通过套接字发送数据包请求。 此外,数据库执行实际的提交,通常需要在服务器上进行磁盘 I / O。 **考虑为您的应用**删除自动提交模式,而改为使用手动提交以更好地控制提交逻辑。
在编写 JDBC 应用时,请确保考虑提交事务的频率。 每次提交都会导致驱动通过套接字发送数据包请求。 此外,数据库执行实际的提交,通常需要在服务器上进行磁盘 I/O。 **考虑为您的应用**删除自动提交模式,而改为使用手动提交以更好地控制提交逻辑。
使用的代码是:
......@@ -104,9 +104,9 @@ Connection.setAutoCommit(false);
为了减少网络流量,可以查看以下建议并对其进行调整以适合您的应用。
1. **使用大容量客户端**时,请使用 addBatch()而不是使用 Prepared Statement 来插入数据。 这会在一个网络数据包中发送多个插入请求,并为您节省一些字节。
2. **不要使用“从表中选择*”** 。 而是指定实际需要的列名称。 我建议您将其作为一种习惯,因为我们很多时候都在这样做,却没有意识到它的负面影响。 试想一下,如果您在还要存储 BLOB 的表中执行此操作。 您从数据库中获取了如此重的对象,并且不使用它。 真是浪费
3. **确保您的数据库设置最大数据包大小**,并且驱动与该数据包大小匹配。 为了获取更大的结果集,这减少了驱动和服务器之间发送/接收的总数据包数量。
1. **使用大容量客户端**时,请使用`addBatch()`而不是使用`PreparedStatement`来插入数据。 这会在一个网络数据包中发送多个插入请求,并为您节省一些字节。
2. **不要使用“`SELECT * FROM TABLE`”**。 而是指定实际需要的列名称。 我建议您将其作为一种习惯,因为我们很多时候都在这样做,却没有意识到它的负面影响。 试想一下,如果您在还要存储 BLOB 的表中执行此操作。 您从数据库中获取了如此重的对象,并且不使用它。 真是浪费
3. **确保您的数据库设置最大数据包大小**,并且驱动与该数据包大小匹配。 为了获取更大的结果集,这减少了驱动和服务器之间发送/接收的总数据包数量。
这就是这篇文章的全部内容。 如果您有任何疑问,请发表评论。
......
此差异已折叠。
......@@ -70,7 +70,7 @@ private Set<AccountEntity> accounts;
## JPA 级联类型
Java 持久性体系结构支持的级联类型如下:
Java 持久性构支持的级联类型如下:
1. **CascadeType.PERSIST** :级联类型`presist`表示 save()或 persist()操作级联到相关实体。
2. **CascadeType.MERGE** :级联类型`merge`表示在合并拥有实体时会合并相关实体。
......
......@@ -239,7 +239,7 @@ List<Product> results = crit.list();
您可以向`Criteria`对象添加多个`Order`对象。 Hibernate 会将它们传递给基础 SQL 查询。 您的结果将按第一顺序排序,然后第一排序中的所有相同匹配项将按第二顺序排序,依此类推。 在幕后, **Hibernate 在将属性**替换为适当的数据库列名称之后,将其传递给 SQL ORDER BY 子句。
## 7\. Hiberate 标准–执行关联(接)
## 7\. Hiberate 标准–执行关联(接)
**一对多或从**多对一连接时,关联有效。 首先,我们将演示如何使用一对多关联来获取价格超过 25 美元的供应商。 请注意,我们为产品属性创建了一个新的 Criteria 对象,为我们刚刚创建的产品条件添加了限制,然后从供应商 Criteria 对象获取结果:
......
......@@ -328,7 +328,7 @@ public SQLQuery createSQLQuery(String queryString) throws HibernateException
```
将包含 SQL 查询的字符串传递给`createSQLQuery()`方法后,应将 SQL 结果与现有的 Hibernate 实体,接或标量结果相关联。 `SQLQuery`接口具有`addEntity()``addJoin()``addScalar()`方法。
将包含 SQL 查询的字符串传递给`createSQLQuery()`方法后,应将 SQL 结果与现有的 Hibernate 实体,接或标量结果相关联。 `SQLQuery`接口具有`addEntity()``addJoin()``addScalar()`方法。
#### 11.1 Hibernate SQL 查询示例
......
......@@ -430,7 +430,7 @@ public class ComputerBook extends Book {
```
## 接表
## 接表
整体式单表方法的替代方法是其他类似的联合表方法。 此处使用了“区分符”列,但各种派生类型的字段存储在不同的表中。
......
......@@ -26,7 +26,7 @@ Hibernate one to many mapping solutions
这个问题可以用两种不同的方式解决。
1. 一种是在帐户表中具有**外键列**,即`EMPLOYEE_ID`。 该列将引用`Employee`表的主键。 这样,没有两个帐户可以与多个员工关联。 显然,为了执行此限制,帐号必须唯一。
2. 第二种方法是有一个通用的**接表**`EMPLOYEE_ACCOUNT`。 该表将具有两列,即`EMP_ID`将是引用`EMPLOYEE`表中主键的外键,而`ACCOUNT_ID`将会是引用`ACCOUNT`表主键的外键。
2. 第二种方法是有一个通用的**接表**`EMPLOYEE_ACCOUNT`。 该表将具有两列,即`EMP_ID`将是引用`EMPLOYEE`表中主键的外键,而`ACCOUNT_ID`将会是引用`ACCOUNT`表主键的外键。
## 1\. 使用外键关联 Hiberate 一对多映射
......@@ -205,9 +205,9 @@ Hibernate: update ACCOUNT set EMPLOYEE_ID=? where ID=?
```
## 2\. 使用接表 Hiberate 一对多映射
## 2\. 使用接表 Hiberate 一对多映射
此方法使用**接表**存储帐户和员工实体之间的关联。 **@JoinTabl** e 注释已用于建立此关联。
此方法使用**接表**存储帐户和员工实体之间的关联。 **@JoinTabl** e 注释已用于建立此关联。
#### 2.1 设计
......@@ -393,7 +393,7 @@ Hibernate: insert into EMPLOYEE_ACCOUNT (EMPLOYEE_ID, ACCOUNT_ID) values (?, ?)
[下载源码](https://docs.google.com/open?id=0B7yo2HclmjI4b2dvbk40cUtvSzQ "hibernate-test-project-one-to-many-association")
在此**使用列表**Hiberate 一对多映射注释示例的过程中,我们学习了使用外键关联和接表技术在两个实体之间创建`1..N`关系船。
在此**使用列表**Hiberate 一对多映射注释示例的过程中,我们学习了使用外键关联和接表技术在两个实体之间创建`1..N`关系船。
学习愉快!
......
......@@ -224,6 +224,6 @@ Hibernate: insert into READER_SUBSCRIPTIONS (readers_ID, subscriptions_ID) value
[下载源码](https://drive.google.com/file/d/0B7yo2HclmjI4ZHdoLVF2Zk1Xc1E/view?usp=drive_web "download example of many to many mapping")
在此示例中,我们了解了**使用注释使多对多接表**处于 Hiberate 状态。
在此示例中,我们了解了**使用注释使多对多接表**处于 Hiberate 状态。
学习愉快!
\ No newline at end of file
......@@ -43,9 +43,9 @@ private AccountEntity account;
```
连接列用 [**@JoinColumn**](https://docs.oracle.com/javaee/5/api/javax/persistence/JoinColumn.html "Join Column annotation") 注释声明,看起来像 **[@Column](https://docs.oracle.com/javaee/5/api/javax/persistence/Column.html "Column annotation")** 注释。 它还有一个名为`referencedColumnName`的参数。 此参数在目标实体中声明将用于接的列。
连接列用 [**@JoinColumn**](https://docs.oracle.com/javaee/5/api/javax/persistence/JoinColumn.html "Join Column annotation") 注释声明,看起来像 **[@Column](https://docs.oracle.com/javaee/5/api/javax/persistence/Column.html "Column annotation")** 注释。 它还有一个名为`referencedColumnName`的参数。 此参数在目标实体中声明将用于接的列。
如果在所有者方未声明`@JoinColumn`,则使用默认值。 将在所有者表中创建一个连接列,其名称将是所有者端关系名称 _(下划线)和所拥有的主键列名称的串联。 侧。
如果在所有者方未声明`@JoinColumn`,则使用默认值。 将在所有者表中创建一个连接列,其名称将是所有者端关系名称 _(下划线)和所拥有的主键列名称的连接。 侧。
在双向关系中,一方(只有一方)必须是所有者。 所有者负责关联列的更新。 *为了声明对关系不负责的一方,使用了 映射的属性 [**。 “ mappedBy”是指所有者一方的关联的属性名称。**](https://docs.oracle.com/javaee/5/api/javax/persistence/OneToOne.html#mappedBy%28%29 "mappedBy")*
......@@ -101,7 +101,7 @@ Hibernate: insert into Employee (ACCOUNT_ID, EMAIL, FIRST_NAME, LAST_NAME) value
当您运行上述程序时,可以在两个表中验证数据和映射。
## 2\. 使用公共接表 Hiberate 一对一映射
## 2\. 使用公共接表 Hiberate 一对一映射
这种方法对我们所有人都不陌生。 让我们从这种技术的目标 DB 结构开始。
......
......@@ -10,7 +10,7 @@
## 2\. 何时使用角度分量
当应用基于**基于组件的体系结构**且用户界面分为较小的 Web 组件(每个组件提供不同的功能)时,应使用 Angular 组件。
当应用基于**基于组件的构**且用户界面分为较小的 Web 组件(每个组件提供不同的功能)时,应使用 Angular 组件。
例如,一个网站可能有一个组件用于捕获反馈,而另一个则用于社交媒体跟踪。
......
......@@ -229,7 +229,7 @@ Jasmine Output
## 4\. 茉莉花描述块
在 Jasmine 中,`describe`功能用于对相关规范进行分组。 string 参数用于命名规范集合,并将其与规范串联在一起以形成规范的全名。 这有助于在大型套件中查找规范。
在 Jasmine 中,`describe`功能用于对相关规范进行分组。 string 参数用于命名规范集合,并将其与规范连接在一起以形成规范的全名。 这有助于在大型套件中查找规范。
好消息是,您也可以嵌套`describe`块。 在嵌套`describe`的情况下,Jasmine 在执行规范之前先按顺序执行每个`beforeEach`函数,然后执行规范,最后逐步执行每个`afterEach`函数。
......
......@@ -65,11 +65,11 @@ Big Data Growth
这个问题可能首先是因为搜索引擎数据使 Google 感到头疼,但随着互联网行业的革命而爆炸(尽管没有任何证据)。 他们使用并行处理的概念巧妙地解决了这个问题。 他们创建了一种称为 MapReduce 的算法。 该算法将任务分为小部分,并将这些部分分配给通过网络连接的许多计算机,然后收集结果以形成最终结果数据集。
当您意识到 I / O 是数据处理中最昂贵的操作时,这似乎合乎逻辑。 传统上,数据库系统将数据存储到单台计算机中,并且当您需要数据时,可以通过 SQL 查询的形式向它们发送一些命令。 这些系统从存储中获取数据,将其放入本地内存区域,进行处理并发送回给您。 这是最好的事情,您可以处理有限的数据和有限的处理能力。
当您意识到 I/O 是数据处理中最昂贵的操作时,这似乎合乎逻辑。 传统上,数据库系统将数据存储到单台计算机中,并且当您需要数据时,可以通过 SQL 查询的形式向它们发送一些命令。 这些系统从存储中获取数据,将其放入本地内存区域,进行处理并发送回给您。 这是最好的事情,您可以处理有限的数据和有限的处理能力。
但是,当您获得大数据时,就无法将所有数据存储在一台计算机中。 您必须将其存储到多台计算机(可能是数千台计算机)中。 而且,当您需要运行查询时,由于高 I / O 成本,您无法将数据聚合到一个位置。 那么 MapReduce 算法的作用是什么? 它会将您的查询独立运行到存在数据的所有节点中,然后汇总结果并返回给您。
但是,当您获得大数据时,就无法将所有数据存储在一台计算机中。 您必须将其存储到多台计算机(可能是数千台计算机)中。 而且,当您需要运行查询时,由于高 I/O 成本,您无法将数据聚合到一个位置。 那么 MapReduce 算法的作用是什么? 它会将您的查询独立运行到存在数据的所有节点中,然后汇总结果并返回给您。
它带来了两个主要的改进,即 I / O 成本非常低,因为数据移动很少。 因为您的工作并行地在多台计算机中分解成较小的数据集,所以时间减少了第二秒。
它带来了两个主要的改进,即 I/O 成本非常低,因为数据移动很少。 因为您的工作并行地在多台计算机中分解成较小的数据集,所以时间减少了第二秒。
## Hadoop 的演变
......
......@@ -21,7 +21,7 @@ File Operations
Block Scanner
```
## HDFS 体系结
## HDFS
HDFS 是 Hadoop 的文件系统组件。 您可以可视化普通文件系统(例如 FAT 和 NTFS),但可以处理非常大的数据集/文件。 默认块大小为 64 MB(HDFS 2 中为 128 MB)。 因此,当您在其中存储大文件时,HDFS 的性能最佳。 小文件实际上会导致内存浪费。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/hadoop/brewers-cap-theorem-in-simple-words/](https://howtodoinjava.com/hadoop/brewers-cap-theorem-in-simple-words/)
当您开始讨论分布式体系结构时,很可能会遇到 **CAP 理论**(或 Brewer 定理)。 CAP 代表一致性,可用性和分区容忍度。 它希望系统设计师在最终设计中在以上三个竞争保证之间做出选择。 据说不可能在系统中实现全部三项,并且您必须在系统的三项保证中最多选择两项。
当您开始讨论分布式构时,很可能会遇到 **CAP 理论**(或 Brewer 定理)。 CAP 代表一致性,可用性和分区容忍度。 它希望系统设计师在最终设计中在以上三个竞争保证之间做出选择。 据说不可能在系统中实现全部三项,并且您必须在系统的三项保证中最多选择两项。
好。 定义似乎简单快捷。 可是等等 !! 您所说的一致性,可用性和分区容忍度是什么意思? 让我们在分布式计算环境中定义这些术语。
......
......@@ -73,7 +73,7 @@ Monolithic vs MicroServices Architecture
与传统的多层单片架构相比,微服务提供了许多*优势。 让我们列出它们:*
* 借助微服务,架构师和开发人员可以为每种微服务选择适用于特定体系结构和技术的**([多语言体系结构](https://www.infoq.com/articles/paradigm-based-polyglot-prog))。 这样可以灵活地以更具成本效益的方式设计更适合的解决方案。**
* 借助微服务,架构师和开发人员可以为每种微服务选择适用于特定架构和技术的**([多语言架构](https://www.infoq.com/articles/paradigm-based-polyglot-prog))。 这样可以灵活地以更具成本效益的方式设计更适合的解决方案。**
* 由于服务**相当简单且规模较小**,因此企业可以承受尝试新流程,算法,业务逻辑等的费用。 它通过提供实验和快速失败的能力,使企业能够进行颠覆性创新。
* 微服务能够实现**选择性可伸缩性**,即每个服务都可以独立地按比例放大或缩小,并且按比例缩放的成本要比单片方法小。
* 微服务是**自包含的独立部署模块**,当第二个微服务未按我们的需要运行时,它可以用另一个类似的微服务代替。 它有助于做出正确的买进建造决策,而这通常是许多企业所面临的挑战。
......
......@@ -6,7 +6,7 @@
## 1\. JAX-RS `@Path` URI 匹配类型
JAX-RS `@Path`注解用于指定其他应用或客户端可在其上访问资源的 URI。 [**`@javax.ws.rs.Path`**](http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/Path.html "path annotation")注解必须存在于类和/或资源方法上。 如果它同时存在于类和方法上,则资源方法的相对路径是类和方法的串联
JAX-RS `@Path`注解用于指定其他应用或客户端可在其上访问资源的 URI。 [**`@javax.ws.rs.Path`**](http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/Path.html "path annotation")注解必须存在于类和/或资源方法上。 如果它同时存在于类和方法上,则资源方法的相对路径是类和方法的连接
`@Path`中的 URI 以两种方式定义。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/resteasy/writing-restful-webservices-with-hateoas-using-jax-rs-and-jaxb-in-java/](https://howtodoinjava.com/resteasy/writing-restful-webservices-with-hateoas-using-jax-rs-and-jaxb-in-java/)
代表性状态转移( [REST](https://restfulapi.net) )是一种设计习语,它使用 Web 的无状态客户端-服务器体系结构将 REST Web 服务表示为 URL 标识的资源。 REST 风格的体系结构由客户端和服务器组成。 客户端向服务器发起请求; 服务器处理请求并返回适当的响应。 请求和响应围绕“资源”的“表示”的传递而构建。 资源可以是可以解决的任何连贯且有意义的概念。 资源的表示形式通常是捕获资源当前或预期状态的文档。
代表性状态转移( [REST](https://restfulapi.net) )是一种设计习语,它使用 Web 的无状态客户端-服务器架构将 REST Web 服务表示为 URL 标识的资源。 REST 风格的架构由客户端和服务器组成。 客户端向服务器发起请求; 服务器处理请求并返回适当的响应。 请求和响应围绕“资源”的“表示”的传递而构建。 资源可以是可以解决的任何连贯且有意义的概念。 资源的表示形式通常是捕获资源当前或预期状态的文档。
> 来源: [http://en.wikipedia.org/wiki/Representational_State_Transfer](https://en.wikipedia.org/wiki/Representational_State_Transfer) 。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/resteasy/comparing-soap-vs-restful-web-services/](https://howtodoinjava.com/resteasy/comparing-soap-vs-restful-web-services/)
尽管 **SOAP****RESTful Web 服务** – 都具有相同的目的,即基于 **SOA(面向服务的体系结构)**构建应用,但是它们在如何帮助实现最终输出的方式上,有着很大程度上不同。 让我们记下基于 SOAP 和 REST 的 API 之间最明显的**区别**
尽管 **SOAP****RESTful Web 服务** – 都具有相同的目的,即基于 **SOA(面向服务的构)**构建应用,但是它们在如何帮助实现最终输出的方式上,有着很大程度上不同。 让我们记下基于 SOAP 和 REST 的 API 之间最明显的**区别**
| SOAP | REST |
| --- | --- |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册