日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DataNucleus 3.0与Hibernate 3.5

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DataNucleus 3.0与Hibernate 3.5 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如官方產(chǎn)品站點(diǎn)所述, DataNucleus Access Platform是現(xiàn)有的最符合標(biāo)準(zhǔn)的開(kāi)源Java持久性產(chǎn)品。 它完全符合JDO1 , JDO2 , JDO2.1 , JDO2.2 , JDO3 , JPA1和JPA2 Java標(biāo)準(zhǔn)。 它還符合OGC簡(jiǎn)單功能規(guī)范,以將地理空間Java類(lèi)型保留到RDBMS。 它使用基于OSGi的插件機(jī)制,這意味著它是非??蓴U(kuò)展的。

如產(chǎn)品官方“關(guān)于”頁(yè)面所述, Hibernate是一種高性能的對(duì)象/關(guān)系持久性和查詢(xún)服務(wù)。 Hibernate是市場(chǎng)上最靈活,功能最強(qiáng)大的對(duì)象/關(guān)系解決方案,它負(fù)責(zé)從Java類(lèi)到數(shù)據(jù)庫(kù)表以及從Java數(shù)據(jù)類(lèi)型到SQL數(shù)據(jù)類(lèi)型的映射。 它提供了數(shù)據(jù)查詢(xún)和檢索功能,大大減少了開(kāi)發(fā)時(shí)間。

出于本文的目的,我們將使用上述眾所周知的產(chǎn)品作為持久性API的實(shí)際實(shí)現(xiàn)。 我們的目標(biāo)是能夠比較對(duì)數(shù)據(jù)庫(kù)應(yīng)用CRUD(創(chuàng)建-檢索-更新-刪除)操作時(shí)的性能。

為此,我們將實(shí)現(xiàn)兩個(gè)不同的基于Spring的WEB應(yīng)用程序,這些應(yīng)用程序?qū)⒊洚?dāng)我們的“測(cè)試基礎(chǔ)”。 這兩個(gè)應(yīng)用程序的服務(wù)和數(shù)據(jù)訪(fǎng)問(wèn)層定義(接口和實(shí)現(xiàn)類(lèi))將完全相同。 對(duì)于數(shù)據(jù)訪(fǎng)問(wèn),我們將利用JPA2作為Java Persistence API。 對(duì)于數(shù)據(jù)庫(kù),我們將使用嵌入式Derby實(shí)例。 最后但并非最不重要的一點(diǎn)是,我們將針對(duì)以下所述的五個(gè)“基本”數(shù)據(jù)訪(fǎng)問(wèn)操作實(shí)施并執(zhí)行相同的性能測(cè)試:

  • 保持記錄
  • 通過(guò)其ID檢索記錄
  • 檢索所有記錄
  • 更新現(xiàn)有記錄
  • 刪除記錄

所有測(cè)試均針對(duì)具有以下特征的Sony Vaio進(jìn)行:

  • 系統(tǒng):openSUSE 11.1(x86_64)
  • 處理器(CPU):Intel(R)Core(TM)2 Duo CPU T6670 @ 2.20GHz
  • 處理器速度:1,200.00 MHz
  • 總內(nèi)存(RAM):2.8 GB
  • Java:OpenJDK 1.6.0_0 64位

使用以下工具:

  • Spring框架3.0.1
  • Apache Derby 10.6.1.0
  • 休眠 3.5.1
  • DataNucleus 3.0.0-m1
  • c3p0 0.9.1.2
  • Brent Boyer的Java Benchmarking框架

最終通知:

  • 您可以在此處和此處下載兩個(gè)“測(cè)試基礎(chǔ)”的完整源代碼。 這些是基于Eclipse – Maven的項(xiàng)目。
  • 為了能夠自己編譯和運(yùn)行測(cè)試,您需要將Java Benchmarking框架二進(jìn)制– jar文件安裝到Maven存儲(chǔ)庫(kù)。 另外,作為“一鍵式”解決方案,您可以使用我們創(chuàng)建的Java Benchmarking Maven軟件包。 您可以從此處下載它,然后將其解壓縮到您的Maven存儲(chǔ)庫(kù)中,一切都很好。

“測(cè)試基地”…

我們將首先提供有關(guān)如何實(shí)施“測(cè)試基礎(chǔ)”項(xiàng)目的信息。 為了使我們的測(cè)試所針對(duì)的環(huán)境的細(xì)節(jié)清晰明了,這勢(shì)在必行。 如前所述,我們已經(jīng)實(shí)現(xiàn)了兩個(gè)基于Spring的多層WEB應(yīng)用程序。 在每個(gè)應(yīng)用程序中,已經(jīng)實(shí)現(xiàn)了兩層,即服務(wù)層和數(shù)據(jù)訪(fǎng)問(wèn)層。 這些層具有相同的定義-接口和實(shí)現(xiàn)細(xì)節(jié)。

我們的領(lǐng)域模型僅包含一個(gè)“雇員”對(duì)象。 服務(wù)層提供了一個(gè)簡(jiǎn)單的“業(yè)務(wù)”服務(wù),該服務(wù)公開(kāi)了“員工”對(duì)象的CRUD(創(chuàng)建-檢索-更新-刪除)功能,而數(shù)據(jù)訪(fǎng)問(wèn)層則包括一個(gè)簡(jiǎn)單的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象,該對(duì)象利用Spring JpaDaoSupport抽象來(lái)提供與數(shù)據(jù)庫(kù)的實(shí)際互操作性。

以下是數(shù)據(jù)訪(fǎng)問(wèn)層特定的類(lèi):

import javax.annotation.PostConstruct; import javax.persistence.EntityManagerFactory;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository;import com.javacodegeeks.springdatanucleus.dto.EmployeeDTO;@Repository("employeeDAO") public class EmployeeDAO extends JpaDAO<Long, EmployeeDTO> {@AutowiredEntityManagerFactory entityManagerFactory;@PostConstructpublic void init() {super.setEntityManagerFactory(entityManagerFactory);}}

如您所見(jiàn),我們的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(DAO)擴(kuò)展了JpaDAO類(lèi)。 該課程如下:

import java.lang.reflect.ParameterizedType; import java.util.List;import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import javax.persistence.Query;import org.springframework.orm.jpa.JpaCallback; import org.springframework.orm.jpa.support.JpaDaoSupport;public abstract class JpaDAO<K, E> extends JpaDaoSupport {protected Class<E> entityClass;@SuppressWarnings("unchecked")public JpaDAO() {ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1];}public void persist(E entity) {getJpaTemplate().persist(entity);}public void remove(E entity) {getJpaTemplate().remove(entity);}public E merge(E entity) {return getJpaTemplate().merge(entity);}public void refresh(E entity) {getJpaTemplate().refresh(entity);}public E findById(K id) {return getJpaTemplate().find(entityClass, id);}public E flush(E entity) {getJpaTemplate().flush();return entity;}@SuppressWarnings("unchecked")public List<E> findAll() {Object res = getJpaTemplate().execute(new JpaCallback() {public Object doInJpa(EntityManager em) throws PersistenceException {Query q = em.createQuery("SELECT h FROM " +entityClass.getName() + " h");return q.getResultList();}});return (List<E>) res;}@SuppressWarnings("unchecked")public Integer removeAll() {return (Integer) getJpaTemplate().execute(new JpaCallback() {public Object doInJpa(EntityManager em) throws PersistenceException {Query q = em.createQuery("DELETE FROM " +entityClass.getName() + " h");return q.executeUpdate();}});}}

以下是我們的域類(lèi)EmployeeDTO類(lèi):

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name = "EMPLOYEE") public class EmployeeDTO implements java.io.Serializable {private static final long serialVersionUID = 7440297955003302414L;@Id@Column(name="employee_id")private long employeeId;@Column(name="employee_name", nullable = false, length=30)private String employeeName;@Column(name="employee_surname", nullable = false, length=30)private String employeeSurname;@Column(name="job", length=50)private String job;public EmployeeDTO() {}public EmployeeDTO(int employeeId) {this.employeeId = employeeId; }public EmployeeDTO(long employeeId, String employeeName, String employeeSurname,String job) {this.employeeId = employeeId;this.employeeName = employeeName;this.employeeSurname = employeeSurname;this.job = job;}public long getEmployeeId() {return employeeId;}public void setEmployeeId(long employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getEmployeeSurname() {return employeeSurname;}public void setEmployeeSurname(String employeeSurname) {this.employeeSurname = employeeSurname;}public String getJob() {return job;}public void setJob(String job) {this.job = job;} }

最后但并非最不重要的是,下面提供了“業(yè)務(wù)”服務(wù)接口和實(shí)現(xiàn)類(lèi):

import java.util.List;import com.javacodegeeks.springdatanucleus.dto.EmployeeDTO;public interface EmployeeService {public EmployeeDTO findEmployee(long employeeId);public List<EmployeeDTO> findAllEmployees();public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;public void deleteEmployee(long employeeId) throws Exception;}import java.util.List;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.javacodegeeks.springdatanucleus.dao.EmployeeDAO; import com.javacodegeeks.springdatanucleus.dto.EmployeeDTO; import com.javacodegeeks.springdatanucleus.services.EmployeeService;@Service("employeeService") public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeDAO employeeDAO;@PostConstructpublic void init() throws Exception {}@PreDestroypublic void destroy() {}public EmployeeDTO findEmployee(long employeeId) {return employeeDAO.findById(employeeId);}public List<EmployeeDTO> findAllEmployees() {return employeeDAO.findAll();}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO == null) {employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.persist(employeeDTO);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null) {employeeDTO.setEmployeeName(name);employeeDTO.setEmployeeSurname(surname);employeeDTO.setJob(jobDescription);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void deleteEmployee(long employeeId) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null)employeeDAO.remove(employeeDTO);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.merge(employeeDTO);}}

接下來(lái)是驅(qū)動(dòng)Spring IoC容器的“ applicationContext.xml”文件。 在兩個(gè)“測(cè)試基礎(chǔ)”項(xiàng)目之間,該文件的內(nèi)容也相同。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"><context:component-scan base-package="com.javacodegeeks.springdatanucleus" /><tx:annotation-driven /><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="MyPersistenceUnit" /></bean><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /></bean></beans>

為了能夠從Servlet容器啟動(dòng)Spring應(yīng)用程序(別忘了我們已經(jīng)實(shí)現(xiàn)了基于Spring的WEB應(yīng)用程序),我們?cè)趦蓚€(gè)“測(cè)試基礎(chǔ)”應(yīng)用程序的“ web.xml”文件中都包含了以下偵聽(tīng)器:

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

這兩個(gè)“測(cè)試基礎(chǔ)”項(xiàng)目之間唯一不同的文件是定義要使用的Java持久性API(JPA)的實(shí)際實(shí)現(xiàn)的文件-“ persistence.xml”文件。 以下是我們用來(lái)利用DataNucleus Access Platform的平臺(tái):

<persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL"><provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider><class>com.javacodegeeks.springdatanucleus.dto.EmployeeDTO</class><exclude-unlisted-classes>true</exclude-unlisted-classes><properties><property name="datanucleus.storeManagerType" value="rdbms"/><property name="datanucleus.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/><property name="datanucleus.ConnectionURL" value="jdbc:derby:runtime;create=true"/><!-- <property name="datanucleus.ConnectionUserName" value=""/><property name="datanucleus.ConnectionPassword" value=""/>--><property name="datanucleus.autoCreateSchema" value="true"/><property name="datanucleus.validateTables" value="false"/><property name="datanucleus.validateConstraints" value="false"/><property name="datanucleus.connectionPoolingType" value="C3P0"/><property name="datanucleus.connectionPool.minPoolSize" value="5" /><property name="datanucleus.connectionPool.initialPoolSize" value="5" /><property name="datanucleus.connectionPool.maxPoolSize" value="20" /><property name="datanucleus.connectionPool.maxStatements" value="50" /></properties></persistence-unit></persistence>

接下來(lái)是用于將Hibernate用作JPA2實(shí)現(xiàn)框架的“ persistence.xml”文件:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ejb.hibernatePersistence</provider><class>com.javacodegeeks.springhibernate.dto.EmployeeDTO</class><exclude-unlisted-classes>true</exclude-unlisted-classes><properties><property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.show_sql" value="false" /><property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" /><property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver" /><property name="hibernate.connection.url" value="jdbc:derby:runtime;create=true" /><!-- <property name="hibernate.connection.username" value="" /><property name="hibernate.connection.password" value="" />--><property name="hibernate.c3p0.min_size" value="5" /><property name="hibernate.c3p0.max_size" value="20" /><property name="hibernate.c3p0.timeout" value="300" /><property name="hibernate.c3p0.max_statements" value="50" /><property name="hibernate.c3p0.idle_test_period" value="3000" /></properties></persistence-unit></persistence>

最后,我們演示實(shí)現(xiàn)所有要執(zhí)行的測(cè)試用例的類(lèi)。 這兩個(gè)“測(cè)試基礎(chǔ)”項(xiàng)目的類(lèi)是相同的:

import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail;import java.util.List; import java.util.concurrent.Callable;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import bb.util.Benchmark;import com.javacodegeeks.springhibernate.dto.EmployeeDTO; import com.javacodegeeks.springhibernate.services.EmployeeService;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/applicationContext.xml"}) public class EmployeeServiceTest {@AutowiredEmployeeService employeeService;@Testpublic void testSaveEmployee() {try {employeeService.saveEmployee(1, "byron", "kiourtzoglou", "master software engineer");employeeService.saveEmployee(2, "ilias", "tsagklis", "senior software engineer");} catch (Exception e) {fail(e.getMessage());}}@Testpublic void testFindEmployee() {assertNotNull(employeeService.findEmployee(1));}@Testpublic void testFindAllEmployees() {assertEquals(employeeService.findAllEmployees().size(), 2);}@Testpublic void testUpdateEmployee() {try {employeeService.updateEmployee(1, "panagiotis", "paterakis", "senior software engineer");assertEquals(employeeService.findEmployee(1).getEmployeeName(), "panagiotis");} catch (Exception e) {fail(e.getMessage());}}@Testpublic void testDeleteEmployee() {try {employeeService.deleteEmployee(1);assertNull(employeeService.findEmployee(1));} catch (Exception e) {fail(e.getMessage());}}@Testpublic void testSaveOrUpdateEmployee() {try {employeeService.saveOrUpdateEmployee(1, "byron", "kiourtzoglou", "master software engineer");assertEquals(employeeService.findEmployee(1).getEmployeeName(), "byron");} catch (Exception e) {fail(e.getMessage());}}@Testpublic void stressTestSaveEmployee() {Callable<Integer> task = new Callable<Integer>() { public Integer call() throws Exception {int i;for(i = 3;i < 2048; i++) {employeeService.saveEmployee(i, "name-" + i, "surname-" + i, "developer-" + i);}return i;}};try {System.out.println("saveEmployee(...): " + new Benchmark(task, false, 2045));} catch (Exception e) {fail(e.getMessage());}assertNotNull(employeeService.findEmployee(1024));}@Testpublic void stressTestFindEmployee() {Callable<Integer> task = new Callable<Integer>() { public Integer call() { int i;for(i = 1;i < 2048; i++) {employeeService.findEmployee(i);}return i;}};try {System.out.println("findEmployee(...): " + new Benchmark(task, 2047));} catch (Exception e) {fail(e.getMessage());}}@Testpublic void stressTestFindAllEmployees() {Callable<List<EmployeeDTO>> task = new Callable<List<EmployeeDTO>>() { public List<EmployeeDTO> call() {return employeeService.findAllEmployees();}};try {System.out.println("findAllEmployees(): " + new Benchmark(task));} catch (Exception e) {fail(e.getMessage());}}@Testpublic void stressTestUpdateEmployee() {Callable<Integer> task = new Callable<Integer>() { public Integer call() throws Exception { int i;for(i=1;i<2048;i++) {employeeService.updateEmployee(i, "new_name-" + i, "new_surname-" + i, "new_developer-" + i);}return i;}};try {System.out.println("updateEmployee(...): " + new Benchmark(task, false, 2047));} catch (Exception e) {fail(e.getMessage());}assertEquals("new_name-1", employeeService.findEmployee(1).getEmployeeName());}@Testpublic void stressTestDeleteEmployee() {Callable<Integer> task = new Callable<Integer>() { public Integer call() throws Exception {int i;for(i = 1;i < 2048; i++) {employeeService.deleteEmployee(i);}return i;}};try {System.out.println("deleteEmployee(...): " + new Benchmark(task, false, 2047));} catch (Exception e) {fail(e.getMessage());}assertEquals(true, employeeService.findAllEmployees().isEmpty());}}

結(jié)果 …

下圖顯示了所有測(cè)試結(jié)果。 縱軸表示每個(gè)測(cè)試的平均執(zhí)行時(shí)間(以微秒(us)為單位),因此值越低越好。 橫軸表示測(cè)試類(lèi)型。 從上面的測(cè)試案例中可以看到,我們?cè)跀?shù)據(jù)庫(kù)中插入了總數(shù)為2047個(gè)“員工”記錄。 對(duì)于檢索測(cè)試用例(findEmployee(…)和findAllEmployees(…)),基準(zhǔn)測(cè)試框架對(duì)每個(gè)測(cè)試用例進(jìn)行了60次重復(fù),以計(jì)算統(tǒng)計(jì)數(shù)據(jù)。 所有其他測(cè)試用例僅執(zhí)行一次。

如您所見(jiàn),在每個(gè)測(cè)試用例中, Hibernate的性能都優(yōu)于DataNucleus 。 特別是在通過(guò)ID(查找)方案進(jìn)行檢索時(shí), Hibernate比DataNucleus快9倍!

我認(rèn)為DataNucleus是一個(gè)很好的平臺(tái)。 當(dāng)您要處理所有形式的數(shù)據(jù)(無(wú)論存儲(chǔ)在何處)時(shí),可以使用它。 從數(shù)據(jù)持久性到異構(gòu)數(shù)據(jù)存儲(chǔ),到提供使用多種查詢(xún)語(yǔ)言進(jìn)行檢索的方法。

使用這種多功能平臺(tái)來(lái)管理應(yīng)用程序數(shù)據(jù)的主要優(yōu)點(diǎn)是,您無(wú)需花費(fèi)大量時(shí)間來(lái)學(xué)習(xí)特定數(shù)據(jù)存儲(chǔ)或查詢(xún)語(yǔ)言的特殊性。 另外,您可以對(duì)所有數(shù)據(jù)使用單個(gè)通用接口,因此您的團(tuán)隊(duì)可以將他們的應(yīng)用程序開(kāi)發(fā)時(shí)間集中在添加業(yè)務(wù)邏輯上,并讓DataNucleus處理數(shù)據(jù)管理問(wèn)題。

另一方面,多功能性要付出代價(jià)。 作為關(guān)系映射(ORM)框架的“硬核”對(duì)象, Hibernate在我們所有的ORM測(cè)試中均輕松勝過(guò)DataNucleus 。

像大多數(shù)時(shí)候一樣,由應(yīng)用程序架構(gòu)師決定最適合其需求的功能(多功能性或性能),直到DataNucleus團(tuán)隊(duì)將其產(chǎn)品開(kāi)發(fā)到可以勝過(guò)Hibernate的地步為止;-)

祝您編碼愉快,不要忘記分享!

拜倫

相關(guān)文章:

  • 每個(gè)程序員都應(yīng)該知道的事情
  • 正確記錄應(yīng)用程序的10個(gè)技巧
  • 軟件設(shè)計(jì)法則
  • Java最佳實(shí)踐系列
  • 生存在狂野西部開(kāi)發(fā)過(guò)程中的9條提示
  • 如何在不到1ms的延遲內(nèi)完成100K TPS
  • 提升您的休眠引擎

翻譯自: https://www.javacodegeeks.com/2011/02/datanucleus-30-vs-hibernate-35.html

總結(jié)

以上是生活随笔為你收集整理的DataNucleus 3.0与Hibernate 3.5的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。