2009-08-31 2 views
23

EJB 3 빈에서 파일 시스템에 어떻게 액세스 할 수 있습니까?EJB 3에서 파일 시스템에 액세스하는 방법은 무엇입니까?

나는이 주제에 대해 인터넷을 검색 한 결과 좋은 답변을 찾지 못했습니다.

일부에서는 java.io/java.nio를 사용하는 것이 좋습니다. 대부분의 응용 프로그램 서버는 어쨌든이 API에 대한 액세스를 허용하는 것 같습니다.

또 다른 아이디어는 JCA 커넥터를 사용하여 파일 시스템이나 LDAP 디렉토리에 액세스하는 것입니다.

간단한 파일이 성능 및 사용 된 리소스면에서 훨씬 더 나은 솔루션이 될 때 데이터베이스에서 BLOB를 사용하지 않으려 고합니다.

이 문제를 어떻게 해결하겠습니까?

+1

데이터베이스에 BLOB가있을 필요는 없습니다. SQL Server 2008은 기본적으로 파일을 DB 서버의 폴더로 덤프하지만 데이터베이스를 통해 노출시키는 파일 스트림 저장소를 지원합니다. http://blogs.msdn.com/rdoherty/archive/2007/10/12/getting-traction-with-sql-server-2008-filestream.aspx – pjp

답변

9

당신이 은 EJB에있는 파일 시스템 액세스로부터을 허용하는 이유는 응용 프로그램이 (자바 EE)에서 실행하는 방식을 통제 컨테이너이 없다는 것입니다. 예를 들어, 응용 프로그램이 서버 클러스터에서 실행될 수 있습니다.이 경우 한 서버의 일부 개체를 디렉토리에 저장하면 거의 사용하지 않을 수 있습니다. 물론 네트워크 파일 시스템을 사용하고 있으므로 제한이 적용되지 않을 수도 있습니다.

하나의 옵션은 사용 당신의 컨테이너와 함께 제공되는 JNDI 구현 될 수있다. 당신은 가능성이 일부 JNDI 위치에서 원시 byte[] 배열을 저장할 수 있습니다, 그래서 당신은 항상 객체의 직렬화 된 형식 아래 절약 할 수있다 :이 나중에 조회 할 수 있으며 개체로 변환 다시

ByteArrayOutputStream baos= new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(myObj); 

//Now save into JNDI 
new InitialContext().bind("path/to/myobject", baos.toByteArray()); 

를 :

byte[] bs = (byte[]) new InitialContext().lookup("path/to/myobject"); 
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs)); 
MyObj myObj = (MyObj) ois.readObject(); 

또는 당신은 XML 문자열로 인스턴스를 인코딩 JNDI에 그것을 저장 java.beans지속적 XML (즉 XMLDecoder, XMLEncoder)를 사용할 수 있습니다.

+0

EJB에서 파일을 작성하는 권장 방법입니까? 파일을 클러스터의 모든 노드에서 사용할 수 있습니까 (실제로 JNDI가 클러스터되어 있으므로 예라고 생각합니다)? JNDI에 대한 마지막 읽기 (또는 쓰기)는 트랜잭션입니다. –

+0

"당신은 허용되지 않습니다"- 더 이상 파일 시스템에 접근 할 수 없으며 EJB 사양에만 적용되는 것이 아닙니다. 그 당시에 쓴 사람은 EJB가 모든 Java EE의 기반이되고 따라서 Java EE와 거의 동등한 것으로 착각했습니다. –

7

애플리케이션을 클러스터링하지 않거나 드라이브를 네트워크 맵핑 할 수 있다는 것을 알고 있다면 java.io. * 만 사용하십시오.

파일 저장소의 루트 위치와 관련하여 적절한 구성을 지정하십시오.

+0

+1이 답변은 단지 * 상식 *입니다. 파일이 다른 프로그램 (EJB를 준수하지 않음)에 의해 채워지면 더 빠르고 명확한 * 방법이 없습니다. – ATorras

+2

Java EE 스펙을 따르지 않는 애플리케이션을 작성함으로써 이식성과 유지 보수성을 확신 할 수 없습니다. 예를 들어, 12 개월 만에이 프로젝트를 끝내고 앱을 클러스터링하는 작업을 감안할 때 가난한 사람에게 큰 놀라움을 줄 수 있습니다. 또는 다른 컨테이너로 이식합니다. –

+7

* "당신이 당신의 신청서를 결코 클러스터하지 않을 것이라는 것을 안다면"* - 당신이 미래를 볼 수 있다면, 도박 산업에서 더 수익성있는 직업이 있다고 생각할 것입니다. –

5

파일 데이터 액세스를 캡슐화하십시오. 그런 다음 위에서 설명한 방법 중 하나를 사용할 수 있습니다. 심지어 데이터베이스를 사용하십시오. 시스템의 성능을 측정하십시오. 요구 사항을 충족하면 수행됩니다. 그렇지 않은 경우 파일 액세스가 한 곳에서 현지화되어 다른 솔루션으로 대체 할 수 있습니다. 소프트웨어를 다른 컨테이너로 이식하거나 다른 사람이 관리해야하는 경우에도 동일한 이점이 있습니다.

+0

캡슐화를위한 +1 – flybywire

1

일반 파일 액세스는 사실상 트랜잭션 적이 아닙니다. 트랜잭션 작업에 대한 지원을 빌드하지 않는 한 (이것은 리소스 관리자의 작업 임) - 당신이 수행중인 작업의 트랜잭션 의미에 대해 걱정해야합니다. 트랜잭션 지원을 구축하면 성능에서 얻을 수있는 것이 거의 없습니다 (데이터베이스의 성능 손실 중 일부는 자원 관리자가 수행 한 모든 부기로 인한 것입니다). 그리고 트랜잭션 관리의 친밀한 사촌 - 동시성을 잊지 마십시오.모든 요청에 ​​대해 새 파일을 작성하지 않는 한 동시성 문제로 인해 어느 정도 문제가 발생합니다.

더 많은 정보는 Sun Blueprint's FAQ on EJB restrictions에서 확인할 수 있습니다.

기술적 인 정당성이 명확하지 않은 경우가 아니면 EJB에서 파일 시스템에 액세스하지 마십시오. 아주 좋은 예는 로깅 (감사는 아님) 프레임 워크가 될 것입니다. 로깅이 트랜잭션 작업 일 필요는 없으므로 파일 시스템에 액세스 할 때 파일 시스템에 액세스 할 때 상대적으로 덜 위험합니다. 로그 파일; 부분적인 쓰기가 허용되는 것은 아닙니다.

+0

싱글 톤/타이머를 통해 로컬에서 파일을 캐싱하는 것이 거의 항상 안전 한 작업의 또 다른 예입니다. –

+1

"[...] 당신이 EJB에서 파일 시스템에 액세스하려고 시도하면 안된다."- 이것이 EJB에만 적용되는 특별한 이유는 전혀 없습니다. EJB bean이되는 빈뿐만 아니라 * 모든 유형의 빈에서 IO를 수행 할 때주의해야합니다. –

관련 문제