2011-04-11 2 views
3

OSGi 번들 내에서 Derby Client를 실행하려고합니다. 번들은 Maven에 의해 빌드되므로 org.apache.derby:derbyclient에 종속성을 추가했습니다. 런타임에 다음 예외가 발생합니다 : java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/testdb.Felix에서 Derby Client를 사용하는 방법?

에 임베디드 드라이버 및 종속성을 사용하면 흥미로운 점이 있습니다. 나는 그 둘의 차이를 보지 못했다.

내가 뭘 잘못하고 어떻게 해결할 수 있습니까?

일부 가벼운 음식 : DynamicImport-Package: * :

  1. 몇 가지 조언 후 나는 다음과 같은 OSGi 프레임 헤더를 설정 인터넷에서 찾을. 임베디드 드라이버의 고정 된 문제이지만 클라이언트는 여전히 실패합니다.
  2. 내가 사용하는 Derby 버전은 10.7.1.1이며 OSGi가 활성화되어 있어야합니다 (적어도 OSGi 헤더가 있음).
+0

EmbeddDriver와 ClientDriver의 차이점은 임베디드 드라이버가 JDK에 의해 자동으로로드된다는 것일 수 있습니다. 클라이언트 드라이버의 경우 Class.forName을 명시 적으로 호출해야합니다. 어쨌든, 당신이 일하게되어 기뻐요! –

+0

@Bryan : 문제는 클래스 로더가 없으면 클라이언트 드라이버에서'Class.forName()'도 실패합니다. 나는 왜 때때로 그것이 때때로 필요하지 않은지 잘 모르겠습니다. – musiKk

답변

2

그래, 내가 해결책을 찾은 이후로 30 분이 지났지 만. 나는 그것이 얼마나 깨끗한 모르지만이 작업을 완수하는 것 같다가 권장은 OSGi에서

ClassLoader ctxtCl = Thread.currentThread().getContextClassLoader(); 
try { 
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 

    try { 
     Class.forName("org.apache.derby.jdbc.ClientDriver"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    dbConnection = DriverManager.getConnection("jdbc:derby://localhost:1527/testdb"); 
} catch (SQLException e) { 
    /* log, etc. */ 
} finally { 
    Thread.currentThread().setContextClassLoader(ctxtCl); 
} 
1

는 연결을 얻기 위해 DrivverManager를 사용하지. 더 좋은 방법은 DataSource를 사용하는 것입니다.

그래서 더비 클라이언트에이를 사용할 수 있습니다

ClientDataSource ds = new ClientDataSource(); 
... // set properties here 
Connection connection = dataSource.getConnection(); 

를 데이터 소스 접근 방식으로 훨씬 더 안정적인은 OSGi에있는 클래스 로더 바이올린하지 않습니다.

또한 클라이언트 코드에서 DataSource를 분리하고이를 OSGi 서비스로 바인딩하는 것이 좋습니다. 이렇게하면 코드에서 데이터베이스에 대한 종속성을 유지할 수 있습니다.

가장 쉬운 방법은 pax-jdbc-config을 사용하여 구성에서 사용자를 위해 데이터 소스를 생성하는 것입니다. 그런 다음 자신의 코드에서 DataSource를 서비스로 바인딩하면됩니다.

pax-jdbc의 현재 릴리스 버전은 아직 derbyclient를 지원하지 않지만 방금 마스터에 추가했습니다. 따라서 다음 릴리스에는이를 포함해야합니다.

+0

답변 해 주셔서 감사합니다. 불행히도 나는 질문을 한 후에 기업과 기술을 전환하여 더 이상 시험 할 수 없습니다. – musiKk

관련 문제