在此处输入代码
我们使用 c3p0 jar 进行数据库池。现在,从 c3p0 代码中,出现以下异常
引起:java.lang.IllegalAccessError:尝试从类 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 访问类 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource$1 在 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.setUpPropertyEvents(AbstractPoolBackedDataSource.java:74) 在 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource。(AbstractPoolBackedDataSource.java:63) 在 com.mchange.v2.c3p0.ComboPooledDataSource。(ComboPooledDataSource.java:109) 在 com.mchange.v2.c3p0.ComboPooledDataSource.(ComboPooledDataSource.java:105)
现在位于 AbstractPoolBackedDataSource.java(第 74 行) PropertyChangeListener l = new PropertyChangeListener()
PropertyChangeListener l = new PropertyChangeListener()
{
public void propertyChange( PropertyChangeEvent evt )
{ resetPoolManager(); }
};
所以,PropertyChangeListener是这里的内部类.. AbstractPoolBackedDataSource$1 PropertyChangeListener 是一个 java 类 java.beans.PropertyChangeListener !!
可能是什么原因?这仅发生在 linux(suse 10) 中。在 Windows 中它工作正常(jdk 1.6_10 和 jre 1.6_20)。我尝试过不同的 jdk、jre 组合(jdk 1.6_25 等)
请您参考如下方法:
我通过一些尝试和错误解决了这个问题。
我还发现,这并不像我之前怀疑的那样可靠。这很容易重现,看起来像是一个潜在的类加载错误。(尽管我不确定它是在 Equinox 实现中还是在 Java 中!!)。
在解释解决方案之前,让我更详细地描述一下场景。
我们已将代码部署在 osgi(equinox) 框架中。有两个包使用 c3p0 jar 进行数据库池,其中之一导出 c3p0 包。该 bundle 先于另一个 bundle 启动。
现在,根据 osgi 规范,osgi 类加载器应该为单独的包维护单独的类加载器实例。现在,当第二个包尝试从 c3p0 jar 加载类时,它的类加载器可能会发现(从父委托(delegate))这些类已经加载了!但它们是从不同的上下文加载的,这导致了访问冲突。
这是初步发现,我将尝试使用 Eclipse 代码进行调试,并可能会深入研究它。更改 bundle 启动顺序后,此问题已解决。