研究生志愿填报及投递系统的设计与实现外文翻译资料

 2022-08-21 23:33:24

Comparison of Java Persistence Layer Technologies

Author: Ang Sun

Abstract

As data and data structures grown more complex in computing, the task of storing and accessing such data efficiently also becomes more complex. Object-oriented programming languages such as Java have popularized the practice of using class-based objects and created the challenge of persisting these complex objects to storage systems such as databases which only store simple scalar values. This paper seeks to explore and compare a selected number of popular persistence solutions for the Java language in their use and performance. This is done through researching, implementing and performance testing the chosen candidates. Through these steps we have found that while more abstracted solutions provided easier implementation and usage, these positives come with the disadvantages of generally slower performance. We also discovered that while many persistence frameworks provide features that minimize the amount of code required for implementation, they suffer from performance issues such as the N 1 query issue if not configured or utilized correctly.

Introduction

Linking software applications to data stores has grown more complex with time. Increasingly elaborate data models mean that reading and writing information to and from storage solutions such as databases may often not be a trivial task[1].

This paper will provide an overview of persistence layer technologies and a comparison of current Java-based implementations. A theoretical comparison will first be conducted on the functional aspects of the software candidates followed by an experiment to determine how well the software candidates perform in a variety of situations.

Background

This section will provide explanation and an overview of concepts relevant to the topic of this paper.

Persistence and Databases

Persistence is the concept of allowing data to persist even beyond the lifespan of the process that created it. Typically this is done by writing data to a physical medium which retains information such as a hard-disk drive. On the software level, persistence can be achieved in many ways. Data can be written as raw data files or arranged in more organised manners through additional software layers [1]. One variety of persistent data storage is database technology.

Databases refer to an organised collection of data arranged in a manner so that they may be accessed efficiently and precisely at a later time [2]. They typically consist of schemas, tables, views, stored procedures and more. Modern databases can be divided into relational databases and non-relational databases commonly referred to as NoSQL. Relational databases store data within table columns that have strictly defined constraints. NoSQL spans a variety of database architectures that forgo the typical tabular relations in favour of simpler data structures that vary depending on implementation. Examples include key-value stores, document stores and graph databases. Database management systems (DBMS) provide an interface through which databases may be defined, created, queried, updated and administrated. While databases are generally not portable across DBMSs, standards such as SQL allow for interoperability between applications and multiple DBMS and database systems.

Table 1.1 shows how a user object may be stored in a relational database table. The table consists of multiple columns each containing a specific type of data e.g. text strings and integers. Each row in the table represents one user object and in this case is identified by a unique key id.

SQL

SQL or Structured Query Language is a programming language for managing data within a relational database [3]. SQL allows for data and schemas to be inserted, updated, retrieved and deleted. Specific implementations of SQL from various database system vendors may not fully follow standards and therefore be incompatible between implementations. This can cause issues in applications which may have to interact with various databases and thus be database agnostic. SQL can also be extended with features to allow for procedural style programming, common dialects of SQL include PL/SQL and T-SQL (or Transact-SQL)[3].

The SELECT statement is the most commonly used operation in SQL. It queries the database to retrieve data from any given number of tables and returns a list of entries. SELECT statement does not make any alterations to data within a database and is considered to be a read-only action. Assuming a database contains a relation ”user”, we can use the SQL statement shown in table 1.1 to retrieve specific columns from said relation and filter the data.

This statement will return the columns id and username from table user for a row that has id 10.

Additional statements include the INSERT statement used for inserting data into a relation; the UPDATE statement for updating existing data in a relation; DELETE statement for removing data in a relation; ALTER statement for making alterations to relations among other statements that may vary from implementation to implementation.

Java and Persistence

Object oriented programming languages such as Java emphasize the usage of class based objects [4]. When the need of persisting these objects arises however, their potential complexity mean that storage using a database becomes difficult since databases can only store simple scalar values [2]. Persistence layer software can help bridge the incompatibility between objects and database storage by automating mapping of SQL queries and actions and/or automatically converting objects into a group of simpler values that can be stored in tables [1].

The User class show in Figure 1.2 can be used

剩余内容已隐藏,支付完成后下载完整资料


附录A 外文翻译

概论

随着数据和数据结构在计算中日益复杂,有效地存储和访问这些数据的任务也变得越来越复杂。例如Java等面向对象的编程语言,虽然已经普及了使用基于类的对象的做法,但也对存储系统带来了挑战——如何将这些复杂对象持久化到只存储简单标量值的数据库中。本文旨在探索和比较Java语言中流行的持久性解决方案的使用和性能。这是通过研究、实施和表现来测试选定的待测项。通过这些步骤,我们发现,虽然抽象的解决方案提供了更便捷的实现和使用,但这些优点通常会带来低性能的缺点。我们也发现,虽然许多持久性框架提供的特性可以实现所需代码量最小化,但如果没有正确配置或使用,则会遇到诸如N 1查询问题等多种性能问题。

1 简介

随着时间的推移,将软件应用程序链接到数据存储变得越来越复杂。越来越复杂的数据模型意味着,从数据库等存储解决方案中读取和写入信息通常不是一件容易的事情。

本文将概述持久层技术,并对当前基于Java的实现进行比较。首先对待测软件的功能方面进行理论比较,然后进行实验,以确定待测软件在各种情况下的性能状态。

    1. 背景

本节将解释和概述与本文主题相关的概念。

      1. 持久性和数据库

持久性是允许数据在创建它的过程的生命周期之外持久化的概念。通常来说,这是通过将数据写入物理介质来完成的,物理介质保留诸如硬盘驱动器之类的信息。在软件层面,持久性可以通过多种方式实现。数据可以作为原始数据文件写入,或者通过附加的软件层以更有组织的方式排列。数据库技术是持久性数据存储的一种形式。

数据库是指以某种方式排列的有组织的数据集合,以便在以后的时间内高效、准确地访问这些数据。它们通常由模式、表、视图、存储过程等组成。现代数据库可以分为关系数据库和非关系数据库,它们通常被称为NoSQL。关系数据库将数据存储在具有严格定义的约束的表列中,NoSQL跨越了多种数据库架构,这些架构放弃了典型的表格关系,而采用了更简单的数据结构,这些结构因实现而异,例如键值存储、文档存储和图形数据库。数据库管理系统(DBMS)提供了一个接口,通过它可以定义、创建、查询、更新和管理数据库。虽然数据库通常不能跨数据库管理系统移植,标准SQL允许应用程序与多个DBMS和数据库系统之间的互操作性存在。

      1. SQL

SQL或结构化查询语言是一种用于管理关系数据库中的数据的编程语言。SQL允许插入、更新、检索和删除数据和模式。来自不同数据库系统供应商的特定SQL实现可能没有完全遵循标准,因此在实现之间不兼容。这可能会导致应用程序出现问题,这些应用程序可能必须与各种数据库交互,因此与数据库无关。SQL还可以扩展为允许过程式编程的特性,SQL的常用方言包括PL/SQL和T-SQL(或Transact-SQL)。

SELECT语句是SQL中最常用的操作。它查询数据库以从任意给定数量的表中检索数据,并返回一个条目列表。SELECT语句不会对数据库中的数据进行任何更改,它被视为只读操作。附加语句包括用于将数据插入到关系中的INSERT语句;用于更新关系中现有数据的UPDATE语句;用于删除关系中数据的DELETE语句;用于对其他语句(可能因实现而异)之间的关系进行更改的ALTER语句。

      1. Java和持久性

面向对象的编程语言,如Java,强调使用基于类的对象。然而,当需要持久化这些对象时,潜在的复杂性意味着使用数据库的存储变得困难,因为数据库只能存储简单的标量值。持久层软件可以通过自动映射SQL查询和操作和/或自动将对象转换为可以存储在表中的更简单的值,来帮助桥接对象和数据库存储之间的不兼容性。POJO代表普通的旧Java对象,是一个用来描述Java类的术语,这些Java类由不同的字段和这些字段的getter/setter方法组成。字段通常被封装用于数据验证和安全。

      1. JPA

JPA(Java Persistence API)是一种规范,它规定了如何使用Java编程语言管理来自关系数据源的数据。一些使用此接口的实现示例包括Hibernate(post version3.0)、OpenJPA和EclipseLink。

      1. ORM软件

ORM或对象关系映射软件用于将复杂的数据类型(如Java对象)转换为更容易存储的数据(如数据库数据)。ORM通常通过将关系数据库表映射到对象属性和将数据库关系映射到适当的对象(取决于关系类型)来进行工作。

    1. 先导研究

各种性质的持久性技术各有利弊。虽然这样的持久层通常通过减少所需的代码量来简化开发,但它们也可能导致糟糕的数据库设计和错误使用其功能时的额外开销。当前持久性技术的各种比较可以在已发表的著作和在线上找到,例如Hibernate ORM和Versant ODBMSby Mikael Kopteff的比较,其中比较了它们的特性和性能;JPAPerformance Benchmark包含了各种不同DBMS系统的JPA实现的综合基准测试结果。

上述工作使用的比较方法通常包括开发选择持久性解决方案的实现和运行常用查询的选择。由此产生的执行时间可以深入了解每个解决方案的运行效率,并可以用作基准。通过对持久性解决方案在功能方面所提供的功能的研究,也对这些特性进行了比较,但以往对持久性技术的研究还没有涵盖不同范式的解决方案。

    1. 问题表述

本文将研究目前在Java世界中发现的各种数据库支持框架的功能和性能。不同的持久性技术侧重于增强软件开发的不同方面,如实现效率、可扩展性和可维护性。在这样做的过程中,它们通常会为更简单的开发带来一定的开销和权衡性能。因此,根据项目的需求和环境,找到最合适的解决方案总是会有所不同。以下是将要比较的持久性解决方案:Hibernate 5.1.0,OpenJPA 2.4.1,MyBatis 3.3.1,JDBC。选择这些待测者是为了涵盖不同的持久性范例,例如ORMs和更多的手动解决方案(在本例中是MyBatis),以及作为参考点的jdbc实现。

    1. 动机

随着面向对象编程语言的出现及其对类对象(本质上是典型的非标量对象)的重视,存储此类数据变得更加复杂。例如,考虑一个基于web的商业平台上的产品列表。产品的面向对象表示可以包括其名称、零售商的数组或字典以及每个零售商提供的价格、库存状态等。尽管“产品”在编程语言中被视为单个对象,但除了某些NoSQL解决方案之外,大多数现代数据库都无法将“产品”存储为单个对象。相反,它必须转换成一组简单的值,并且理想情况下,将其复杂的字段(如retailers)拆分为单独的表并用关系引用。持久层软件有助于弥合对象的编程实现与其存储格式之间的差距。

本文将比较现有的各种持久化技术,概述它们的优缺点;从而使持久性解决方案更适合于哪种情况。

    1. 研究问题

Q1:在持久化框架中如何处理SQL查询生成

Q2:持久性框架如何实现复杂化

Q3:持久化框架在表面有什么程度上的不同

Q4:持久性框架在软件开发中提供了哪些潜在的好处

我希望那些增加抽象(比如ORMs)的框架能够通过减少所需的代码量来降低实现的复杂性。由于执行查询时会有更大的开销,因此它们的性能也会受到更大的影响。尽管Java类和数据库表之间的自动映射等特性有助于减轻复杂的实现,但它们也阻碍了开发人员对源数据库或其在代码中的使用方式在很大程度上的直接控制。

    1. 范围/限制

在本文中,重点将放在四个持久性框架的性能和实现复杂性上;为此,我将不深入研究比较可能提供的众多功能和特性集。虽然Java语言可用的持久性框架的数量远远超过已选择的那些,但是实现是非常耗时的,并且拥有较小的待测池将允许更简洁的比较。此外,任何形式的外部反馈(如调查和访谈)都不适用于实施复杂性的比较,因为它需要多人参与一项研究;鉴于该项目的时间框架和资源,该项目太大,无法处理。

    1. 目标作用群体

这项研究对希望在项目中使用持久层软件的开发人员有帮助。它概述了各种持久性解决方案,并对它们的性能进行了比较,详细说明了持久性框架如何在性能和易用性之间进行权衡。它还将使读者了解哪些类型的持久性解决方案适合于哪种情况。

  1. 方法

本章节将构建科学的方法和方式来尝试回答研究的问题。

2.1 科学方法

由于本文提出的研究问题在质量上是多方面的,我将进行归纳和演绎研究,试图回答它们。研究问题1将通过理论研究来回答,因为我们可以从持久化框架的各种文档中推断出它的答案。对于需要定量数据的研究问题2和3,我将成为持久性框架的实现,通过它我将指导实验并展示结果。最后一个问题将以一种反思的方式得到回答,在准备和执行实验过程中获得的经验将作为基准。

2.2 方式描述

最初的研究将包括阅读文档和探索持久性框架的功能。文件来源将严格限制为官方文件,以确保可靠和准确的信息。然后,将创建每个持久性技术的实现,以实现其功能的军事化,并准备一个测试其性能的实验。架构的设计使其易于实现和理解,但仍然包含一对多和多对多关系的设计模式,以便它们可以用于持久性实现中。为了确保实现复杂性的公平比较,每个实现都需要能够实现遵循功能要求:

实验将通过在每个持久性实现中运行一组预先确定的查询来进行,将从该实验中提取和分析的结果将是执行查询所需的时间和返回的查询结果。每个查询将运行多次,并使用平均值作为结果。

每个查询都将使用一个测试运行程序运行。这样做是为了将测试查询与外部干扰隔离开来,并确保在测试之间的数据库中没有实际更改任何数据。

每个框架的实现复杂性将通过计算每个实现编写的代码行总数来衡量,这包括源代码和配置文件。

2.3 可靠性和有效性

为了提高性能比较实验的可靠性,我将设置实验环境,使其受外部干扰最小。为了实现这一点,实验将在运行安装Ubuntu操作系统的虚拟机中进行。每个持久性实现都将使用相同的目标数据库进行测试,并且事务将被用来确保在实验之间数据不会受到任何影响。

  1. 实施

本节将提供单个待测软件的概述,并描述实现。所有的实现和下面的实验都是在一个运行Ubuntu 14.0464位的虚拟机上进行的。IntelliJ IDEA 15.0.4社区版作为开发编译的项目IDE,PostgreSQL 9.3.11作为后台数据库。

    1. Hibernate

Hibernate是一个始于2001年的ORM框架。自3.0版发布以来,除了提供自己的本地API外,它还获得了API 2.0的JPA认证。 Hibernate利用HQL或Hibernate 查询语言代替SQL提供针对自己数据对象的高级查询功能,而不是直接与数据库交互。Hibernate通过诸如延迟初始化/加载和处理关系的各种获取策略等特性为性能调整提供支持。

      1. 实现

Hibernate实现由配置文件和对象类组成,配置文件Hibernate.cfg.xml包含与目标数据库类型、连接详细信息、类映射和Hibernate特定设置有关的信息。映射中给定的类是用注释标记的pojo,用于定义持久性属性。项目的文件结构如图所示。

@Entity注释用于将类指定为如图所示的持久性实体。后面跟着@Table注释,它设置要持久化的数据库表;如果类名与tablename匹配,则可以省略此项。

@ID声明我们的整数id为POST实体的标识符属性。我们还注意到,通过使用@generatedvalue对该字段进行注释,可以自动生成该字段的值。

最后,@Column表示数据库表中相应列的名称。 图3.4显示了这些注释的作用方式和id列。

约束也可以在@Column注释中定义。Post模型中的created_at字段是由数据库自动处理的生成时间戳。禁止从Hibernate插入和更新此字段可以通过传递参数来完成,如图3.5所示。

如图3.6所示,可以使用适当的注释引用外键。@OnetoOne关系是通过提供外键列和声明字段为相关的Java类来定义的。在这种情况下,用户对象通过外键字段user_id引用。当从数据库中获取对象时,Hibernate将根据配置立即或延迟自动解析用户对象。

@ManyToMany关系比一对一关系更复杂。 持有两个模型主键的中间表与外键列一起在@Junitable注释中定义。为了实现一个多对多个关系的紧急解析,参数fetch设置为fetchtype.eager。这样做可以确保Hibernate在返回查询结果之前获取相关对象。在我们实验的情况中,这并不是一对一的关系,因为他们在默认情况下是紧急的。

    <li

    剩余内容已隐藏,支付完成后下载完整资料


    资料编号:[409615],资料为PDF文档或Word文档,PDF文档可免费转换为Word

    </li

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。