2012-03-05 3 views
3

내 OSGi 환경에서 추가 사용을 위해 데이터베이스 드라이버를 미리로드하려고합니다. 일반적으로 다음과 같이 수행 할 수 있습니다.OSGi Felix 및 BndTools - 이름으로 클래스로드

Class.forName("com.mysql.jdbc.Driver"); 

그런 다음 연결을 만들 수 있습니다. 그러나 펠릭스 (Felix)의 OSGi에서이 클래스를 사용하면 클래스를 찾을 수없고 (ClassNotFoundException) 연결을 만들 수 없다고 그는 말합니다. 나는 그런 일 (try-catch 생략)를 할 때 :

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver 
Class.forName("com.mysql.jdbc.Driver"); 

그런 모든 것이 잘 작동하고 연결이 만들어집니다. 그러나 드라이버 클래스를 교환 할 수 없기 때문에 이것은 그리 좋지 않습니다.

첫 번째 방법으로 클래스를로드하는 방법이 있습니까? 올바른 클래스 로더를 제공해야한다고 가정합니다. 그러나 나는 그것을 어디에서 얻을 수 있습니까?

MySQL 드라이버는 OSGi 랩퍼 번들로 제공됩니다.

+0

소스에 클래스 이름이있는 경우 Class.forName으로 동적 클래스를로드 할 필요가 없습니다. 동적 클래스 로딩은 런타임 메커니즘을 통해 클래스 이름을 얻는 경우에만 사용해야합니다. –

답변

4

정확히 어떻게 번들 목록을 만드나요? 도구를 사용하여 번들의 OSGi import 문을 자동으로 분석하면 간단한 문자열을 패키지 종속으로 인식하지 못하기 때문에 첫 번째 방법에서 오류가 발생합니다. 두 번째 방법은 종속성을 하드 Java 종속성으로 표현하므로 필수 OSGi import 문 (OSGi 런타임에 의해 번들의 클래스 경로에 추가됨)을 추가하는 툴링에서 인식됩니다.

첫 번째 방법을 사용하려면 번들의 OSGi import 문에 com.mysql.jdbc 패키지에 종속성을 추가해야합니다. 이것이 어떻게 달성되는지는 도구에 따라 다르며 Bnd는 Import-Statement 구성 매개 변수를 사용합니다.

3

@Heri가 대답 한 내용은 모두 정확하다고 말했습니다. 그러나이 시스템에 더 많은 유연성을 도입하려면 OSGi 서비스을 사용하십시오.

데이터베이스 연결을 만들고 싶지만 코드를 특정 데이터베이스 또는 JDBC 드라이버와 밀접하게 연결하고 싶지는 않습니다. javax.sql.DataSource 서비스를 게시하는 작은 JDBC 래퍼 번들을 작성하지 않으시겠습니까? 그런 다음 로직 번들은 데이터베이스 쿼리를 원할 때 서비스에 바인딩 할 수 있으며 물리적 데이터베이스 연결에 대해 아무 것도 알 필요가 없습니다.

JDBC 래퍼 번들은 특정 JDBC 드라이버에 대해 알아야하지만 매우 얇은 번들이므로 사용하려는 각 드라이버에 대해 대체 래퍼를 생성 할 수 있습니다.