2009-10-21 3 views
2

Oracle에 이식해야하기 때문에 현재 SQL Server에서 작동하는 응용 프로그램에 DAO 계층을 도입하려고합니다.Oracle 및 SQLServer에서 최대 절전 모드

나는 배포 설정에 따라 올바른 DAO를 선택하기 위해 Hibernate를 사용하고 공장 쓰기 (또는 의존성 삽입 사용)를하고 싶다. 이 경우 모범 사례는 무엇입니까? hibernate.cfg.xml과 * .hbm.xml 파일이 다른 두 개의 패키지를 가지고 공장에서 적절하게 선택해야합니까? 내 DAO가 (너무 많은) 번거 로움없이 두 DBMS 모두에서 올바르게 작동 할 가능성이 있습니까?

+0

DAO는 데이터 액세스 개체를 나타냅니다. 자세한 정보 : http://en.wikipedia.org/wiki/Data_access_object – wassimans

답변

3

테이블 이름과 열이 둘 사이에서 동일하다고 가정하면 동일한 hbm.xml 파일을 사용할 수 있어야합니다. 그러나 Hibernate의 dialect를 SQLServer에서 Oracle로 바꿀 필요가 있기 때문에 다른 Hibernate Configuration 값 (hibernate.cfg.xml)을 제공해야 할 것입니다. 데이터베이스 서버 당 하나 - - 둘 사이에 약간의 이름의 차이가있는 경우

, 그때 매핑 파일의 두 세트를 만들 것이며, 별도의 JAR 파일 (예 : yourproject-sqlserver-mappings.jaryourproject-oracle-mappings.jar)로 다음을 패키지, 하나를 사용하여 응용 프로그램을 배포 JAR 또는 기타 환경에 따라 달라집니다.

3

production.properties 파일에 설정된 속성에 따라 배포시에 클라이언트를 위해이 작업을 수행했습니다. 모든 xml 변환기를 사용할 수있는 Ant를 사용하여 파일의 hibernate.dialect 파일을 바 꾸었습니다. 최대 절전 모드 코드가 원활 그러나 이것은 단지 BTW 모두 데시벨 등 HQL/JPAQL 표준 기능이 더 데시벨 특정 함수 호출을 즉,하지 작업 할 것은 UPPER(s) 같은이 점 이온이 도움, LENGTH(s)

DB를 구현해야하는 경우 호출 필연적으로 다르다면 @matt가 제안한 것과 같은 것을해야 할 것입니다.

3

많은 데이터베이스 (Oracle, Informix, SQL Server, MySQL)를 지원하는 응용 프로그램을 작성했습니다. 하나의 구성 파일과 하나의 매핑 집합이 있습니다. 우리는 데이터베이스 연결을 위해 jndi를 사용하므로 응용 프로그램에서 다른 연결 URL을 다룰 필요가 없습니다. SessionFactory를 초기화 할 때 기본 연결에서 데이터베이스 유형을 추론하는 메소드가 있습니다. 예를 들어, 수동으로 JNDI를 통해 연결을 가져온 다음 connection.getMetaData(). getDatabaseProductName()을 사용하여 데이터베이스가 무엇인지 찾으십시오. 컨테이너 환경 변수를 사용하여 명시 적으로 설정할 수도 있습니다. 그런 다음 configuration.setProperty (Environment.DIALECT, deducedDialect)를 사용하여 Dialect를 설정하고 SessionFactory를 정상적으로 초기화하십시오.

당신이 처리해야 할 몇 가지 것들 :

  • 차 키 생성. TableGenerator 전략의 사용자 정의 버전을 사용하므로 테이블 이름과 다음 키에 대한 열이있는 하나의 키 테이블이 있습니다. 이렇게하면 모든 데이터베이스가 오라클의 시퀀스, SQL Server의 기본 시퀀스가 ​​아닌 동일한 전략을 사용할 수 있습니다.
  • 데이터베이스와 관련된 기능입니다. 우리는 가능할 때 그들을 피합니다. Hibernate 사투리가 가장 일반적인 것을 처리한다. 때로는 우리 고유의 방언 클래스에 자신을 추가해야 할 수도 있습니다. 날짜 산술은 꽤 비표준이므로 함수 이름을 만들어 각 데이터베이스의 방식으로 매핑합니다.
  • 스키마 생성 - 우리는 Hibernate 스키마 생성 클래스를 사용한다 - 그것은 방언으로 작동하여 각 데이터베이스 유형에 대해 올바른 DDL을 생성하고 데이터베이스가 매핑과 일치하도록 만든다. 각 데이터베이스에 대한 키워드를 알고 있어야합니다 (예 : Oracle에 USER 테이블 (USERS가 작동 함) 또는 MySQL의 TRANSLATION 테이블을 가지려고 시도하지 마십시오.제 생각에는 http://psoug.org/reference/sqlserver.html

    가장 큰 함정은 다음과 같습니다 : 1) 날짜

3

여기에 오라클과의 SQLServer의 차이를 매핑 테이블이 있습니다. 기능과 메커니즘은 완전히 다릅니다. 각 DB마다 다른 코드를 사용해야합니다. 2) 키 생성 - 오라클과 SQLServer는 다른 메커니즘을 사용하며 자신의 키 테이블을 사용하여 "기본"생성을 피하려고하면 모든 "삽입"을 완전히 직렬화합니다. 성능이 좋지 않습니다. 3) 동시성/잠금은 약간 다릅니다. 성능에 민감한 코드 부분은 각 DB마다 다를 수 있습니다. 4) Oracle은 대소 문자를 구분합니다. SQLServer는 대소 문자를 구분하지 않습니다. 그걸 조심해야 해.

더 많은 것이 있습니다. 두 개의 DB에서 실행되는 SQL 코드를 작성하는 것은 어렵습니다. 그것을 빨리 만드는 것은 때때로 불가능 해 보일 수 있습니다.