2009-11-09 2 views
4

저는 이전에 J2EE 코딩을 해왔 던 사람이고 새로운 J2EE 프로젝트에서 작업하기 위해 다시 돌아오고 있습니다. 2001 년 이래로 많은 변화가 있었기 때문에이 기본적인 질문을해야합니다.JNDI와 javax.sql.DataSource

내 데이터베이스 클래스에서이 같은 구문을 사용하고 있습니다 :

@Resource(name = "jdbc/MyDatabase") 
private javax.sql.DataSource dataSource; 

나는이 새로운 기능 (주석)하지만 난 어떻게 작동하는지 정말 모르겠어요 이해합니다. 나중에 수업 시간에 다음과 같이 호출합니다.

Connection c = dataSource.getConnection(); 

그리고 항상 매번 NullPointerException을 발생시킵니다. 디버거에서이 단계를 밟아 나가고 dataSource는 null입니다.

코드에서 dataSource를 직접 초기화하지 않는 것이 이상하고 이상한 것처럼 보입니다. 내가 뭘 잘못하고 있는거야?

내 web.xml의 자원 설정하기 위해 다음 블록이 포함되어

<resource-env-ref> 
    <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name> 
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> 
</resource-env-ref> 

을 그리고 난 META-INF에서의 context.xml 파일을 사용하여 내 상황이 추가되었습니다. 내가 톰캣 6, MySQL은 5, 최신의 MySQL 드라이버 (이전 V3하지하지만 최신 V5 드라이버)를 사용하고

<Resource name="jdbc/MyDatabase" auth="Container" type="javax.sql.DataSource" 
    maxActive="100" maxIdle="30" maxWait="10000" 
    username="username" password="password" driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://127.0.0.1:3306/mydb?autoReconnect=true"/> 

: 같은 맥락 항목이 보인다.

업데이트 : 평범한 클래스에서 사용하고 있기 때문에 업데이트가 작동하지 않습니다. 나는 새 프로젝트를 만들고 그것에 서블릿을 추가했다. DataSource는 서블릿에서 null이 아닙니다.

답변

6

당신은에 다음이 적어도 필요하거나 애플리케이션 서버의 /conf/context.xml 또는 웹 응용의 /META-INF/context.xml 파일 :

<Resource 
    name="jdbc/MyDatabase" 
    type="javax.sql.DataSource" 
    driverClassName="com.your.Driver" 
    url="jdbc:your://url" 
    username="foo" 
    password="bar" 
/> 

는 또한 http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

과에서를 볼 수있는 웹 애플리케이션의 /WEB-INF/web.xml 다음을 정의해야합니다 :

<resource-env-ref> 
    <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name> 
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> 
</resource-env-ref> 

편집 : 게시물을 편집하여 코딩을 추가 한 것을 확인했습니다. resource-env-ref 대신 resource-ref을 사용했음을 알았습니다. 첫 번째는 외부 리소스 (읽기 : webcontainer-managed는 아님)를 참조하고 두 번째는 내부 (환경) 리소스 (읽기 : webcontainer-managed)를 참조합니다. 그것을 교체하고 참조하십시오.

+0

오, 나는 @Resource가 web.xml에서 설정을 제거한다는 것을 알지 못했습니다. 감사! – the0ther

+0

죄송합니다. 주석을 혼란스럽게 만들었습니다. 실제로 web.xml에서 리소스를 정의해야합니다. 그 대신''로 정의하면됩니다. 메시지가 수정되었습니다. – BalusC

+0

내 모든 db 코드는 구식 연결 풀링을 구현하는 레이어에 묻혀 있습니다 ... 공용 생성자가없는 Singleton DbPool 클래스. 그게 내게 문제를 일으키는 원인이 될지도 모른다. 나는 그것을 모두 애타게하고 이것에 벌거 벗은 뼈를 쐈다. 개인 데이터 소스 dataSource 필드는 어떤 시점에서 null이 아닌 것으로 초기화됩니까?개인 생성자가없는 클래스에서 이것을 사용하면 문제가되지 않습니까? 해당 멤버가 생성자가 처음 호출 될 때 자동으로 초기화됩니까? – the0ther

2

web.xml에서 리소스를 정의합니까? this example을보세요. web.xml 또는 jdbc/MyDatabase를 정의하는 코드를 게시 할 수 있습니까?