2012-05-29 2 views
0

내가이 멀티 테넌트 (multi-tenant) 응용 프로그램이 있고 난 변화 런타임 그래서 거 공유 할 수 있습니다 DB 별도의 스키마 SaaS는 디자인의 스키마 이름이 필요 콜백.은 EclipseLink 변화 스키마는

왜냐하면 EntityManagerFactory를 작성하는 것이 매우 비싸기 때문에 EntityManger를 시작한 후에 모든 DB 호출 전에 스키마를 지정하고 EMF 응용 프로그램 범위를 만들고 싶습니다. Postgresql 8.1 Postgresql은 DB 연결 설정시 스키마 선택을 지원하지 않기 때문에 다른 스키마의 테이블에서 쿼리하는 유일한 방법은 'SET'을 검색하는 것입니다. search_path = "my.schema" ' 필요한 DB 호출을 만든다.

나는 시도했다.

StringBuilder sb = new StringBuilder();     
sb.append("SET search_path TO my.schema");    
entityManager_.createNativeQuery(sb.toString()).executeUpdate(); 

내가 java.lang.IllegalStateException를 '말하는 예외를 가지고 : 당신은이 쿼리에 executeUpdate의()를 호출 할 수 없습니다. 그것은

내가이 작업이 완료 얻을 수있는 어쨌든이 잘못된 쿼리 유형을 PersistenceProvider로 내가 는 EclipseLink을 사용하고 '

및 애플리케이션 매니저로 글래스 피쉬입니까? 당신이 세입자 당 스키마를하고있는 때문에 미리

+0

어땠습니까? 아직도 주변에 있습니까? –

답변

2

감사를 달성하는 더 나은 방법이 있는지

내가 당신은 또한 세입자 특정 데이터베이스 로그인 역할을 사용하고, 어떤 suggesstions 열어주는 말들 (사용자 ID)? 그렇다면, 당신은 사용자에게 기본 검색 경로를 결합 할 수 있습니다

ALTER USER thetenant SET search_path = 'thetenant'; 

또한 경우

REVOKE ALL ON SCHEMA thetenant FROM public; 
GRANT ALL ON SCHEMA thetenant TO tenant; 

당신이 훨씬 더 큰 정도로 서로 사용자를 분리합니다,하지만 그들은거야 여전히 pg_catalogINFORMATION_SCHEMA의 콘텐츠가 표시됩니다.

이렇게하려면 임차인 당 로그인 역할을 사용해야합니다. Java 연결 풀이 일반적으로 풀링 된 연결의 사용자 ID를 전환 할 수 없으며 사용자 ID 당 하나의 풀을 유지해야하기 때문에 연결 풀링이 실행되는 경우 어려울 수 있습니다. PostgresSQL의 SET SESSION AUTHORISATION 구문은 유용 할 수 있습니다. 단일 마스터 사용자로 로그인 한 다음 특정 작업에 필요한 사용자로 전환 할 수 있지만 Java 풀이 직접 지원하는지 여부는 알 수 없습니다. SET SESSION AUTHORISATION을 인식하는 PgBouncer 및 PgPool-II와 같은 외부 연결 풀을 사용할 수도 있고, 인터셉터를 쓸 수있는 방법이 있는지 확인할 수 있으므로 풀에서 체크 아웃 할 때 SET SESSION AUTHORISATION을 연결할 수 있습니다. 다시 확인하십시오.

역할 기반 액세스를 사용할 수없는 경우에도 검색 경로에서 동일한 접근 방식을 시도합니다. 연결 풀링 프로그램의 도움으로 연결을 트래핑 할 수 있는지 확인하십시오. 풀에서 작업을 위해 다시 체크 아웃되고 릴리스시 다시 체크인됩니다. 이렇게하는 방법은 연결 풀에 따라 달라 지지만 그 세부 사항에 들어가기를 원하지는 않을 것입니다.

그런데 왜 선사 시대 버전의 PostgreSQL을 사용하고 계십니까?

EclipseLink가 귀하의 명령을 거부하는 이유를 모르겠습니다. 액면가에서는 합리적인 것처럼 보입니다. 고대 버전의 다른 것들도 사용하고 있습니까? 어떤 Glassfish와 EclipseLink 버전을 사용하고 있습니까?

+0

8.1 버전 용 문서 http://www.postgresql.org/docs/8.1/static/sql-set-session-authorization.html –

+0

지금은 입주자별로 데이터베이스 로그인 역할이 없으며 유일한 DB 사용자가 'postgres'이면 나중에 구현해야합니다. 나는 PostgreSQL을 v9로 업그레이드하려고 노력할 것이다. * 그러나 문제의 원인을 찾아야한다. 나는 명령 줄에서 'SET search_path'가 예상대로 작동하기 때문에 eclipselink가 DB 연결을 설정하는 방법이라고 생각한다. 트랜잭션을 시작한 후 EM을 시작한 후에도이 DB 호출을 시도했지만 아무 것도 작동하지 않고 예외가 위에 있습니다. PG 이외의, 나는 도구의 최신 버전을 사용하고 있습니다. 내가 DB를 업 그레 이드 후, 게시물을 업데이 트됩니다 덕분에 –

+0

당신은 "Pg"이외 말할 때 PgJDBC 포함합니까? 예, 고대 PgJDBC를 사용하고 있습니까, 아니면'9.1-902 JDBC 4'를 사용하고 있습니까? 6 개월 동안이 질문을 다른 사람이보고있을 때 "현재"가 명확하지 않기 때문에 실제 버전을 btw로 지정해야합니다. –