2011-10-24 3 views
1

enter code here 우리는 데이터베이스 풀링을 위해 c3p0 jar를 사용하고 있습니다. 이제 c3p0 코드에서 다음 예외가 발생합니다.IllegalAccessError in Linux (수세 10)

발생 원인 : java.lang.IllegalAccessError : 클래스 com.mchange.v2.c3p0.impl에서 클래스 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource $ 1에 액세스하려고 시도했습니다. com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource에서 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.setUpPropertyEvents (AbstractPoolBackedDataSource.java:74) 에서 .AbstractPoolBackedDataSource . (AbstractPoolBackedDataSource.java:63)에서 com.mchange .v2.c3p0.ComboPooledDataSource. (ComboPooledDataSource.java:109) com.mchange.v2.c3p0.ComboPooledDataSource에서. (ComboPooledDataSource.java:105)

이제 AbstractPoolBac에서 kedDataSource.java (라인 74) = 새로운의 PropertyChangeListener PropertyChangeListener에 L을()

PropertyChangeListener l = new PropertyChangeListener() 
{ 
public void propertyChange(PropertyChangeEvent evt) 
{ resetPoolManager(); } 
}; 

그래서 PropertyChangeListener를 여기 내부 클래스이다 .. AbstractPoolBackedDataSource $ 1 가 PropertyChangeListener를 자바 클래스 java.beans.PropertyChangeListener있다!

이유가 무엇일까요? 이것은 리눅스에서만 발생합니다 (suse 10). Windows에서는 잘 작동합니다 (jdk 1.6_10 및 jre 1.6_20). 다른 jdk, jre 조합 (jdk 1.6_25 등)을 시도했습니다.

답변

1

시행 착오를 사용하여이 문제를 해결했습니다.

또한 이전에 의심했던 것처럼 신뢰할 수없는 것으로 나타났습니다. 이것은 쉽게 재현 할 수 있으며 잠재적 인 클래스 로딩 버그처럼 보입니다. (비록 그것이 분주 한 구현인지 아니면 java인지 확실하지 않습니다 !!).

해결 방법을 설명하기 전에보다 정교하게 시나리오를 설명하겠습니다.

우리는 코드를 osgi (춘분) 프레임 워크에 배치했습니다. 데이터베이스 풀링에 c3p0 jar를 사용하는 두 개의 번들이 있으며 그 중 하나는 c3p0 패키지를 내 보냅니다. 이 번들은 다른 하나보다 먼저 시작됩니다.

이제 osgi 스펙에 따르면 osgi 클래스 로더는 별도의 번들에 대해 별도의 클래스 로더 인스턴스를 유지 관리해야합니다. 이제 두 번째 번들이 c3p0 jar에서 클래스를로드하려고 시도하면 클래스 로더는 클래스가 이미로드되었음을 부모 위임에서 찾을 수 있습니다! 그러나 다른 컨텍스트에서로드되어 액세스 위반이 발생합니다.

이것은 초기 결과이며, 이클립스 코드로 디버깅을 시도하고 더 자세히 조사 할 수 있습니다. 번들 시작 순서를 변경하면이 문제가 해결됩니다.