Google App Engine의 자바 용 JDO와 JPA


81

Struts2로 Google App Engine에서 프로젝트를 개발하고 싶습니다. 데이터베이스의 경우 JPA와 JDO의 두 가지 옵션이 있습니다. 제발 제안 해 주 시겠어요? 둘 다 저에게 새롭고 배워야합니다. 그래서 나는 당신의 대답 후에 하나에 집중할 것입니다.

감사.

답변:


32

JPA는 지속성에 대한 Sun의 표준이고 JDO는 IMHO 죽어 가고 있습니다 (실제로는 죽었지 만 여전히 움직이고 있습니다). 즉, JPA는 장기적으로 더 나은 투자 인 것 같습니다. 그래서 둘 다 나에게 처음이라면 JPA를 선택했을 것입니다.


52
JDO는 죽지 않고 다른 청중을 대상으로합니다. 사실을 확인하십시오. JDO에는 JDO 2.1, JDO 2.2 및 현재 JDO 2.3이 있습니다. JDO는 데이터 저장소에 독립적입니다. JPA는 RDBMS만을 대상으로합니다. 사실
DataNucleus

17
글쎄요, 버전이 아무리 많아도 JDO 채택이 성공했다고 말할 수 없다고 생각합니다. 눈을 뜨십시오. JDO는 수십억 개의 버전을 가질 수 있습니다. 어쨌든 아무도 그것을 사용하지 않습니다. 그런 다음 JPA가 RDBMS만을 대상으로하는 경우 Google의 BigTable에서이 API를 사용할 수있는 이유를 설명해주세요. 감사.
Pascal Thivent

10
여러분, Google이 선택했다면 죽지 않습니다. 그들은 자신이하는 일을 알고 있습니다. 그건 그렇고, @DataNucleus를 축하합니다. 그들이 당신의 구현을 선택하는 것을 보았습니다.
santiagobasulto 2011 년

6
이것은 잘못된 대답입니다. JPA는 rdbms에 따라 다릅니다. 따라서 최근 몇 년 동안 보았던 대체 데이터 저장소 (소위 NoSQL)의 급증과 함께 사용할 수 없습니다. 적어도 추악한 타협없이. 그러니 "JPA is daed"를 정답으로 표시하지 마십시오
smartnut007 2011-08-18

2
인기에 따라 옵션을 선택해서는 안됩니다. 전체 GAE 플랫폼은 큰 테이블을 기반으로하며 JDO가있는 이유입니다!
FUD

33

GAE / J Google 그룹에는 이에 대한 여러 게시물이 있습니다. 나는 거기를 검색하고 사람들의 의견을 볼 것입니다. 위에 표현 된 의견과는 매우 다른 메시지를 받게됩니다. 또한 BigTable이 RDBMS가 아니라는 사실에 주목하십시오. 작업에 적합한 도구 사용


3
Google App Engine 이 완전한 실수 인 경우 datanucleus-appengine 플러그인 ( datanucleus.org/products/accessplatform/appengine/support.html 인용 )을 사용하여 BigTable 데이터 저장소에 JPA를 지원하는 이유는 무엇 인가요? 이것에 대해 자세히 설명해 주시겠습니까?
Pascal Thivent

16
비 RDBMS 데이터 저장소에 대한 JPA 지원에는 API 및 쿼리 언어에 대한 손상이 포함됩니다. 많은 것들이 적합하지 않아 RDBMS에 특화되어 지원되지 않습니다 (예를 들어 JPQL의 중요한 부분 또는 많은 JPA 주석 등). 결과적으로 데이터 저장소간에 완전한 이식성을 가질 수 없기 때문에 BigTable에서 JPA를 사용하는 것은 RDBMS 저장소에 사용할 내용을 직접 복사하는 모든 인수가 거짓입니다.
DataNucleus

6
반면 JDO의 경우 쿼리 언어 (JDOQL)에는 RDBMS 특정 구성 요소가 없으며 메타 데이터는 RDBMS 특정 구성 요소가 완전히 분리되어 전체적으로 데이터베이스 중립적입니다. 따라서 데이터 저장소간에 이식성이 있습니다. JDO API를 사용하면 필요한 경우 각 데이터 저장소에 기본 쿼리 언어를 사용할 수 있습니다.
DataNucleus

9
전체 JPA API를 사용할 수 있다고 말한 적은 없지만, 이것이 JPA 지식을 재사용하는 것을 막지는 못하기 때문에 JPA를 사용하지 않는 타당한 이유가 아닙니다. 그리고 BTW, 데이터 저장소 간 이식성 은 실제 생활에서 발생하지 않습니다 .
Pascal Thivent

4
내가 무슨 말을하든 동의하지 않을 것이므로 토론은 의미가 없으며 대담한 유형이 필요하지 않습니다. 예, 클라이언트가 그렇게했기 때문에 데이터 저장소 간의 이식성이 발생합니다. 언제나 그렇듯이 사람들은 프로젝트 요구 사항에 따라 스스로 결정해야합니다. 이것이 DataNucleus 문서에서 말하는 것입니다. --Andy (DataNucleus)
DataNucleus

24

DataNucleus가 직접 JPA와 JDO를 비교 한 내용을 살펴 보았습니다. http://www.datanucleus.org/products/accessplatform_2_1/jdo_jpa_faq.html 눈을 뜨게하는 사람.


3
이 Datanucleus의 선언문은 매우 친 JDO 인 것 같습니다. 그들의 모든 진술은 JPA에 대해 비판적이고 JDO를 방어하는 것처럼 보이지만 JDO를 사용하는 것보다 JPA를 사용하는 것이 더 행복한 활동임을 알았습니다.
Blessed Geek

8
DataNucleus는 JDO와 JPA를 모두 지원하며 실제로 대부분의 JPA2를 DN 2.0에 포함했습니다. 다른 모든 지속성 솔루션과 달리 두 가지를 모두 홍보하며 사용자가 선택할 수 있습니다. JDO 또는 JPA의 적용 범위에 사실적인 오류가 있다고 생각되면 귀하의 의견을 환영합니다. 귀하를 대신하여 정치적 의제에 참여하는 경우 자신의 감정을 자신에게
맡기는

16

저는 JDO의 행복한 사용자입니다. 좋은 일을 계속하십시오.


2
저는 행복한 JDO 사용자입니다. 일단 익숙해지면 저에게 잘 맞습니다. 또한 JDO를 사용하면 영구 데이터 교환을 완전히 다시 설계하지 않고도 GAE / J 및 Google BigTable에서 벗어날 수 있습니다.
Ian Marshall

12

JDO가 죽었다고 주장하는 사람들은 장점이 없습니다. Pro EJB 3 Java Persistence API 책에서 읽은 내용은 다음과 같습니다. "곧 Sun은 JDO가 사양 유지 관리 모드로 축소되고 Java Persistence API가 JDO 및 다른 지속성 공급 업체에서 가져와 단일 지원이 될 것이라고 발표했습니다. 앞으로 표준. ". 저자 Mike Keith는 EJB3의 공동 사양 리더입니다. 물론 그는 JPA의 큰 지지자이지만 거짓말을 할만큼 편견이있는 것 같지는 않다.

이 책이 출판되었을 때 JDO가 JPA보다 더 고급 기술 기능을 가지고 있음에도 불구하고 대부분의 주요 공급 업체가 JDO가 아닌 JPA 뒤에 통합 된 것은 사실입니다. IBM / Oracle과 같은 EE 세계의 대기업도 대형 RDBMS 벤더이기 때문에 놀라운 일이 아닙니다. 더 많은 고객이 프로젝트에서 비 RDMBS보다 RDMBS를 사용하고 있습니다. JDO는 GAE가 큰 도움을 줄 때까지 죽어 가고있었습니다. GAE 데이터 저장소가 관계형 데이터베이스가 아니기 때문에 의미가 있습니다. 집계 쿼리, 조인 쿼리, 소유 된 다 대다 관계와 같은 일부 JPA 기능은 bigtable에서 작동하지 않습니다. BTW, GAE는 JDO 2.3을 지원하고 JPA 1.0 만 지원합니다. GAE가 타겟 클라우드 플랫폼이라면 JDO를 추천하겠습니다.


11

기록적으로는 Google App Engine (GAE)이므로 Oracle / Sun 규칙이 아닌 Google 규칙을 사용합니다.

그 아래에서 JPA는 GAE에 적합하지 않고 불안정하며 예상대로 작동하지 않습니다. Google은 지원할 의사가 없지만 최소한의 지원을 제공합니다.

그리고 다른 부분에서 JDO는 GAE에서 매우 안정적이며 Google에서 (일부 확장) 잘 문서화되어 있습니다.

그러나 Google은 이들 중 어느 것도 권장하지 않습니다.

http://code.google.com/appengine/docs/java/datastore/overview.html

저수준 API는 최고의 성능을 제공하며 GAE는 성능에 관한 것입니다.

http://gaejava.appspot.com/

예를 들어 엔티티 10 개를 추가합니다.

파이썬 : 68ms

JDO : 378ms

자바 네이티브 : 30ms


그것은 내가 당신의 테스트를 실행할 때 얻은 결과가 아닙니다.
code511788465541441

9

JDO와 JPA 간의 경쟁에서 나는 데이터 핵 포스터에만 동의 할 수 있습니다.

우선, 가장 중요한 것은 datanucleus의 포스터가 그들이 무엇을하고 있는지 알고 있다는 것입니다. 그들은 결국 영구 라이브러리를 개발하고 있으며 관계형 이외의 데이터 모델 (예 : Big Table)에 익숙합니다. 나는 id가 hibernate에 대한 개발자가 여기에 있었다고 확신한다. 그는 "우리의 핵심 라이브러리를 구축 할 때 우리의 모든 가정은 관계형 모델과 밀접하게 결합되어 있으며, hibernate는 GAE에 최적화되어 있지 않다"고 말할 것이다.

둘째, JPA는 의심 할 여지없이보다 광범위하게 사용되며 공식 Java EE 스택의 일부가되는 데 도움이되지만 반드시 더 나은 것은 아닙니다. 사실 JDO는 JPA보다 더 높은 수준의 추상화에 해당합니다. JPA는 RDBMS 데이터 모델과 밀접하게 연결되어 있습니다.

프로그래밍 관점에서 볼 때 JDO API를 사용하는 것이 훨씬 더 나은 옵션입니다. 개념적으로 타협하는 것이 훨씬 적기 때문입니다. 사용하는 제공자가 기본 데이터베이스를 지원하는 경우 이론적으로 원하는 데이터 모델로 전환 할 수 있습니다. (실제로 GAE의 개체에 기본 키를 설정하고 특정 데이터베이스 공급자 (예 : google)에 연결되기 때문에 높은 수준의 투명성을 달성하는 경우는 거의 없습니다.) 그래도 마이그레이션하는 것이 더 쉬울 것입니다.

셋째, Hibernate, Eclipse Link 및 GAE와 함께 스프링을 사용할 수 있습니다. Google은 애플리케이션을 빌드하는 데 사용되는 프레임 워크를 사용할 수 있도록 많은 노력을 기울인 것 같습니다. 그러나 사람들이 마치 RDBMS에서 실행중인 것처럼 GAE 애플리케이션을 빌드 할 때 깨닫는 것은 속도가 느리다는 것입니다. GAE의 봄은 느립니다. 이 주제에 대한 Google IO 비디오를 검색하여 그것이 사실인지 확인할 수 있습니다.

또한 표준을 준수하는 것은 원칙적으로 박수를 보냅니다. 반면에 JPA는 Java EE 스택의 일부이기 때문에 사람들은 때때로 옵션 개념을 잃게됩니다. 원하는 경우 Java Server Faces도 Java EE 스택의 일부임을 인식하십시오. 그리고 웹 GUI 개발을위한 믿을 수 없을 정도로 깔끔한 솔루션입니다. 그러나 결국, 내가 그렇게 말할 수 있다면 더 똑똑한 사람들이이 표준에서 벗어나 대신 GWT를 사용하는 이유는 무엇입니까?

이 모든 과정에서 JPA에 매우 중요한 일이 하나 있다고 생각해야합니다. 그것은 Guice와 JPA에 대한 편리한 지원입니다. 이 시점에서 Google은 평소처럼 똑똑하지 않았으며 현재로서는 JDO를 지원하지 않는 것에 만족합니다. 나는 여전히 그들이 그것을 감당할 수 있다고 생각하고 결국 Guice는 JDO도 삼킬 것입니다.


6

JDO로 이동하십시오. 경험이 없어도 습득하기 어렵지 않고 새로운 기술을 습득 할 수 있습니다!


6

JDO이 글을 쓰는 시점에서 사용하는 것이 끔찍하다고 생각 하는 것은 유일한 구현 벤더 Datanucleus이며 그 단점은 경쟁이 부족하여 다음과 같은 수많은 문제가 발생한다는 것입니다.

  1. 다음과 같은 일부 측면에 대한 자세한 문서는 extensions
  2. 당신은 보통 (로그를 확인 했습니까? 기록을 가지고있는 이유가있을 수 있습니다)와 같은 저자들로부터 비꼬는 반응을 얻습니다.
  3. 도움이되는 시간 내에 질문에 대한 답변을 얻지 못합니다. 때로는 7 일 이내에 답변을 받으면 여기에서도 스스로 운이 좋다고 생각해야합니다. StackOverflow

나는 항상 누군가가 JDO직접 사양을 구현하기를 바라고 있습니다. 그러면 작성자가 상업적 지원에만 관심이 있다고 말하는 것이 아니라 커뮤니티에 더 많은 무료 관심을 제공하고 지원 비용을 항상 Datanucleus신경 쓰지 않을 것입니다. , 그러나 나는 단지 말하는 것입니다.

개인적으로 Datanucleus저자는 Datanucleus자신이나 커뮤니티에 대해 어떠한 의무도 없다고 생각 합니다. 그들은 언제든지 전체 프로젝트를 중단 할 수 있으며 아무도 그것을 판단 할 수 없습니다. 그것은 그들의 노력과 자신의 재산입니다. 그러나 당신은 당신이 무엇을 얻고 있는지 알아야합니다. 우리 개발자 중 한 명이 사용할 프레임 워크를 찾을 때 프레임 워크 작성자를 처벌하거나 명령 할 수는 없지만 다른 한편으로는 작업을 완료해야합니다! 그 프레임 워크를 작성할 시간이 있다면 왜 처음부터 하나를 찾겠습니까?!

다른 한편으로, JDO그 자체는 매우 직관적이고 일반적이지 않은 (제 생각에) 객체 수명주기와 같은 몇 가지 복잡한 문제를 가지고 있습니다.

편집 : 이제 JPA개체 수명주기 메커니즘을 적용한다는 것을 알고 있으므로 표준 ORM API (예 : JPA또는 JDO) 를 사용하려는 경우 지속되는 개체 수명주기 상태를 처리하는 것이 불가피한 것처럼 보입니다.

내가 가장 좋아하는 것은 JDO상당한 노력없이 모든 데이터베이스 관리 시스템으로 작업 할 수있는 능력입니다.


거의 모든 관찰에 대해 맞습니다. ORM은 복잡한 지속성 개체 (문자 그대로 몇 달간 디버그합니다!)에 대한 고통입니다. 현재 속성이 변경되고 내 코드가 최신 버전에서 작동하지 않기 때문에 DN 2.1을 사용하고 있습니다. 즉, JDO를 사용하는 DN은 제 생각에 갈 길입니다.
marcolopes

3

GAE / J는 연말 이전에 MYSQL을 추가 할 예정입니다.


2
이것에 대한 출처가 있습니까?
Taylor Leese 2010-08-18

1
이것이 사실이 아니라고 생각하고이를 뒷받침 할 온라인 정보를 찾을 수없고 게시물과 함께 제공된 증거가 없기 때문에 비추천했습니다.
Steve Armstrong

3
로드맵은 완전한 기능을 갖춘 SQL 데이터베이스가 작업에 있음을 언급합니다. code.google.com/appengine/business/roadmap.html
Ashwin Prabhu

재미 있었지만 지금 (2011 년 8 월 31 일) 우리는 그것이 전혀 사실이 아니라는 것을 발견했습니다.
magallanes 2011-08-31

1
사실이 아니다? Google의 App Engine SQL 미리보기 (베타) URL은 꽤 길기 때문에 goo.gl/AhsxX (믿지 않는 경우를 대비하여 설명 할 필요가 있다고 생각했습니다)를 줄였습니다.
Big Rich

1

JPA는 표준화 된 API로 밀려 나고 최근에 EJB3.0에서 추진력을 얻고있는 것처럼가는 길입니다. JDO는 힘을 잃은 것 같습니다.


1

둘 다!

저렴하고 (더 적은 리소스 사용) 더 빠르기 때문에 Objectify를 사용하십시오. 참고 : http://paulonjava.blogspot.mx/2010/12/tuning-google-appengine.html

Objectify는 Google App Engine 데이터 저장 소용으로 특별히 설계된 자바 데이터 액세스 API입니다. 그것은 "중간 지대"를 차지합니다. JDO 또는 JPA보다 사용하기 쉽고 투명하지만 저수준 API보다 훨씬 편리합니다. Objectify는 초보자가 즉시 생산성을 발휘할 수 있도록 설계되었지만 GAE 데이터 저장소의 모든 기능을 제공합니다.

Objectify를 사용하면 유형이 지정된 개체를 유지, 검색, 삭제 및 쿼리 할 수 ​​있습니다.

@Entity
class Car {
    @Id String vin; // Can be Long, long, or String
    String color;
}

ofy().save().entity(new Car("123123", "red")).now();
Car c = ofy().load().type(Car.class).id("123123").now();
ofy().delete().entity(c);

데이터 스토어 전용입니까? 클라우드 SQL은 어떻습니까?
Timeless

1
단점은 공급 업체와 밀접하게 연결되어 있다는 것입니다. 항상 문제는 아니지만 JDO의 요점은이를 피하는 것입니다. (아마도 작은 서비스에 사용할 사람으로 말하면서).
Pijusn 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.