문제

은 거기에 실행 가능한 대안이 최대 절전 모드?이 바람직하지 않는 무언가를 기초 자체에 JPA.

우리의 문제는 우리는 건물의 복잡한(으로서,많은 개체는 각각 다른)상태 RIA 시스템입니다.것으로 최대 절전 모드는 사용하도록 설계되어 주로 one-off 응용 프로그램-JSF 과 같습니다.

문제는 주로는 게으른니다.이후 여러 가지가있을 수 있습니다 HTTP 요청 사이 초기화 과제 선적 게으른 컬렉션,세션당 트랜잭션은 질문입니다.수명이 긴 세션(중 하나는 응용 프로그램별)작동하지 않거나,기 때문에 한 번 트랜잭션을 안 하고 예외가 발생하는 전체 세션이 무효화되어서,게으른 로드된 개체는 휴식입니다.다음의 모든 종류의 물건 그냥 우리를 위해 작동 하지 않습니다(같은 데이터를 암시적 지속의 데이터를 외부에서 초기화된 트랜잭션).

나는 가난한 설명을 제외하고,바닥을 줄이는 최대 절전 모드는 마법의하지 않습니다.는 것 같 TopLink 지 않는 더 나은,그것은 또한 서면에서 최고의 EJB.

그래서,무국적자는 지속성층(또는 심지어 밝은 충분한 객체 지향 데이터베이스에 추상화 계층)우리가 무엇을 해야 합니다.

어떤 생각을 하거나 내가 뭔가를 요구하지 않는 존재입니까?

편집: 죄송한 모호한 용어를,그리고 당신을 위해 모든 수정 및 통찰력 있는 답변이 있습니다.사람들 수정 나,당신은 모든 올바른 의미 JPA 지,EJB.

도움이 되었습니까?

해결책

언급했듯이 JPA <> ejb는 관련이 없습니다. EJB 3은 JPA를 활용하기 위해 발생하지만 그 문제입니다. 우리는 JPA를 사용하여 EJB를 실행하는 데 가까워지지 않는 많은 것들을 가지고 있습니다.

당신의 문제는 기술이 아니라 디자인입니다.

또는 당신의 디자인은 거의 모든 현대 프레임 워크에 쉽게 맞지 않습니다.

구체적으로, 여러 HTTP 요청에 걸쳐 거래를 계속 유지하려고합니다.

당연히, 대부분의 모든 일반적인 관용구는 각 요청 자체가 각 요청이 더 큰 트랜잭션의 일부인 것이 아니라 하나 이상의 트랜잭션이라는 것입니다.

트랜잭션이 본질적으로 상태가 적기 때문에 같은 토론에서 "Sationeless"및 "Transaction"이라는 용어를 사용할 때 분명한 혼란이 있습니다.

큰 문제는 단순히 거래를 수동으로 관리하는 것입니다.

거래가 여러 HTTP 요청을 통해 발생하고 있으며, 해당 HTTP 요청이 "매우 빠른"실행 중이라면 실제로 실제 문제를 겪지 않아야합니다. 요청은 데이터베이스 트랜잭션 시설을 활용하기 위해 동일한 DB 연결을 사용합니다.

즉, 간단히 말하면, 당신은 DB에 연결하여 세션에 포함 시키며 거래 기간 동안 모든 HTTP 요청이 동일한 세션뿐만 아니라 그러한 방식으로 진행되는지 확인하십시오. 실제 연결이 여전히 유효합니다. 구체적으로, 나는 실제로 한 머신에서 다른 기계로 장애 조치 또는로드 밸런싱에서 생존 할 수있는 선반 JDBC 연결이 있다고 생각하지 않습니다.

따라서 단순히 DB 트랜잭션을 사용하려면 동일한 DB 연결을 사용하는지 확인해야합니다.

이제 장기적인 트랜잭션에 "사용자 상호 작용"이 있다면 DB 트랜잭션을 시작하고 사용자가 "무언가를 할 때까지 기다릴 때까지 기다립니다. 그러면 그 디자인이 모두 잘못되었습니다. 특히 대화 형 환경에서 오래 살았던 거래는 단순히 나쁘기 때문에 그렇게하고 싶지 않습니다. "스트림을 가로 지르는"것처럼. 하지 마십시오. 배치 트랜잭션은 다르지만 대화식 오랫동안 살아있는 거래는 나쁘다.

대화식 거래를 실용적으로 짧게 살 수있는 것으로 유지하려고합니다.

이제 거래에 동일한 DB 연결을 사용할 수 없으면 축하합니다. 자체 거래를 구현할 수 있습니다. 즉, 백엔드에 트랜잭션 기능이없는 것처럼 시스템과 데이터 흐름을 설계 할 수 있습니다.

즉, 본질적으로 데이터를 "커밋"하기 위해 자신의 메커니즘을 생각해 내야한다는 것을 의미합니다.

이를 수행하는 좋은 방법은 데이터를 단일 "트랜잭션"문서로 점진적으로 구축 한 다음 해당 문서를 실제 작업을 많이 수행하는 "저장"루틴으로 공급하는 것입니다. 마찬가지로, 데이터베이스에 행을 저장하고 "구원받지 않은"것으로 표시 할 수 있습니다. 당신은 모든 행으로 그렇게하고, 마지막으로 저장된 모든 데이터를 통해 실행되는 루틴을 호출하고 단일 트랜잭션 미니 배치 프로세스에서 "저장된"것으로 표시합니다.

한편, 다른 모든 SQL은 "저장되지 않은"데이터를 무시합니다. 일정 스탬프를 던지고 사신 프로세스 청소를하십시오 (정말로 귀찮게하고 싶다면 DB에 죽은 줄을 남기는 것이 실제로 더 저렴할 수 있습니다. 볼륨에 따라 다릅니다) "불완전한"거래.

소리만큼 나쁘지 않습니다. 당신이 진정으로 무국적 환경을 원한다면, 그것이 나에게 들리는 것처럼 들리면, 이런 일을해야합니다.

마음,이 모든 것에서 지속성 기술은 실제로 그것과 아무 관련이 없습니다. 문제는 기술보다는 트랜잭션을 사용하는 방법입니다.

다른 팁

다른 JPA 제공 업체 (Hibernate 중 하나입니다)를 살펴 보면 살펴보십시오. eclipselink. Toplink Essentials의 JPA 1.0 참조 구현보다 훨씬 더 완벽합니다. 실제로 Eclipselink는 Glassfish V3 Final과 함께 제공된 JPA 2.0 참조 구현입니다.

JPA는 컨테이너 내부와 외부에서 사용할 수 있기 때문에 좋습니다. 나는 JPA를 사용하여 좋은 효과를 낸 스윙 고객을 썼습니다. EJB 2.0/2.1이 제공 한 것과 동일한 낙인과 XML 수하물이 없습니다.

더 가벼운 무게 솔루션을 받고 있다면 더 이상 보지 마십시오. 이바 티스, 나는 Java 플랫폼에서 선택한 지속성 기술이라고 생각합니다. 그것은 가볍고 SQL에 의존합니다 (ORM 사용자가 ORM이 좋은 SQL을 생산하는 데 소요되는 시간이 놀랍습니다).

몇 가지 점을 수정하기 위해 :

  • JPA는 EJB에 구축되지 않은 EJB의 범죄 층입니다.
  • 괜찮은 JPA 제공 업체는 많은 캐싱이 진행되고 있으며 모든 것을 알아 내기가 어려울 수 있습니다 (이것은 "단순성이 왜 그렇게 복잡한가?"의 좋은 예일 것입니다). 당신이 징계하지 않은 일을하지 않는 한, 예외는 관리되는 객체에 문제가되지 않아야합니다. 런타임 예외는 일반적으로 롤백 트랜잭션 (Spring의 트랜잭션 관리를 사용하고 누가 그렇게하지 않는 경우). 공급자는로드 또는 지속 된 객체의 캐시 된 사본을 유지합니다. 엔티티 관리자 외부에서 업데이트하려는 경우 (명시 적 캐시 플러시 또는 사용이 필요한 경우 EntityManager.refresh()).

나는 당신이보아야한다고 생각합니다 아파치 카이엔 "큰"프레임 워크에 대한 아주 좋은 대안입니다. 괜찮은 모델러를 사용하면 학습 곡선이 좋은 문서로 단축됩니다.

나는 보았다 단순한 작년에 가벼운 무기 디자인에 깊은 인상을 받았습니다. 이제 버전 3이있는 것 같습니다. 그러나 나는 그 사람에 대한 경험이 없습니다.

ebean orm (http://www.avaje.org)

사용하기에 더 직관적 인 ORM입니다.

  • 매핑에 JPA 주석을 사용합니다 (@entity, @onetomany 등)
  • Sessionless API- 최대 절전 모드 세션 또는 JPA 엔티티 관리자 없음
  • 게으른 로딩은 작동합니다
  • 더 큰 성능을위한 부분 객체 지원
  • "Autofetch"를 통한 자동 쿼리 튜닝
  • 봄 통합
  • 큰 쿼리 지원
  • 배치 처리에 대한 큰 지원
  • 배경 페치
  • DDL 생성
  • 원하는 경우 원시 SQL을 사용할 수 있습니다 (ibatis만큼 좋습니다).
  • LGPL 라이센스

  • 롭.

BEA Kodo(formerlly Solarmetric Kodo)는 또 다른 대안입니다.그것은 지원 JPA,JDO 및 EJ3.그것은 고도로 구성하고 지원할 수 있는 적극적인 pre-인출,파견/부착됩니다.

하지만,무엇에서 당신이 설명,Toplink 을 처리할 수 있어야 합니다 당신의 문제입니다.대부분은,당신은 당신이 필요할 수 있 연결/분리를 개체에서의 지속성 계층으로 요청 시작과 끝입니다.

참고로, OP의 디자인이 그의 가장 큰 문제인 이유 : 여러 사용자 요청에 걸쳐 트랜잭션에 걸쳐있는 이유는 앱에 연결된 사용자가있는 것처럼 주어진 시간에 많은 공개 트랜잭션을 가질 수 있음을 의미합니다. 거래는 커밋 될 때까지 연결을 바쁘게 유지합니다. /복구하다. 수천 명의 동시에 연결된 사용자가 있으면 수천 개의 연결을 의미 할 수 있습니다. 대부분의 데이터베이스는이를 지원하지 않습니다.

최대 절전 모드 나 Toplink (eclipselink)는 EJB를 기반으로하지 않으며 둘 다 Pojo 지속성 프레임 워크 (ORM)입니다.

나는 이전 답변에 동의합니다. iBatis는 ORM 프레임 워크에 대한 좋은 대안입니다 : 좋은 캐싱 메커니즘을 가진 SQL을 완전히 제어합니다.

다른 옵션 중 하나는 토크입니다. 위에서 언급 한 옵션보다 낫다고 말하는 것이 아니라 단지 다른 옵션이라는 것입니다. 지금은 꽤 나이가 들었지만 요구 사항 중 일부에 적합 할 수 있습니다.

토크

내가 동면 대체를 찾고있을 때 나는 우연히 발견했다. Datanucleus 액세스 플랫폼, 이것은 Apache2-licensed orm입니다. LDAP, DB4O 및 XML과 같은 RDBMS보다 다른 데이터 소스에서도 데이터의 지속성과 검색을 제공하기 때문에 ORM이 아닙니다. 사용 경험이 없지만 흥미로워 보입니다.

패러다임을 완전히 깨뜨리는 것을 고려하십시오 독스. Java 클래스가 필요한 경우 XML 결과를로드 할 수 있습니다. JDOM.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top