Java Can';t使MXBean通过JConsole连接到数据库
我只是希望如果有人看到并解决了这个问题。我有一个MBean和一个MXBean类。两者都使用相同的服务类通过DAO类访问数据库。我正在使用Spring3.0初始化这些类,并使用JConsole测试这些bean。这两个bean都有相同的方法名来访问它们的服务类,比如methodA()。但是当连接到oracle数据库时,只有MBean类返回数据。另一个MXBean类产生一些错误Java Can';t使MXBean通过JConsole连接到数据库,java,spring,tomcat,jmx,jconsole,Java,Spring,Tomcat,Jmx,Jconsole,我只是希望如果有人看到并解决了这个问题。我有一个MBean和一个MXBean类。两者都使用相同的服务类通过DAO类访问数据库。我正在使用Spring3.0初始化这些类,并使用JConsole测试这些bean。这两个bean都有相同的方法名来访问它们的服务类,比如methodA()。但是当连接到oracle数据库时,只有MBean类返回数据。另一个MXBean类产生一些错误 以下是错误 EL Severe]: 2012-05-18 10:37:54.134--ServerSession(199
以下是错误
EL Severe]: 2012-05-18 10:37:54.134--ServerSession(1992289)--Thread(Thread[RMI TCP Connection(6)-10.208.138.241,5,RMI Runtime])--java.lang.IllegalArgumentException: interface oracle.ucp.jdbc.LabelableConnection is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
at oracle.ucp.jdbc.proxy.ConnectionProxyFactory.createConnectionProxy(ConnectionProxyFactory.java:78)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:658)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:613)
at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:607)
at org.springframework.jdbc.datasource.DelegatingDataSource.getConnection(DelegatingDataSource.java:83)
at com.trgr.cobalt.dataorch.datasource.BaseDODataSource.getRawConnection(BaseDODataSource.java:76)
at com.trgr.cobalt.dataorch.datasource.BaseDODataSource.getConnection(BaseDODataSource.java:46)
at com.trgr.cobalt.dataorch.datasource.BaseDODataSource.getConnection(BaseDODataSource.java:35)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connectInternal(DatasourceAccessor.java:327)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.connectInternal(DatabaseAccessor.java:291)
at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:415)
at org.eclipse.persistence.sessions.server.ConnectionPool.buildConnection(ConnectionPool.java:155)
at org.eclipse.persistence.sessions.server.ExternalConnectionPool.startUp(ExternalConnectionPool.java:118)
at org.eclipse.persistence.sessions.server.ServerSession.connect(ServerSession.java:495)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:627)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:230)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:389)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:164)
这是我的spring配置
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="namingStrategy" ref="namingStrategy"></property>
<property name="assembler" ref="assembler"></property>
<property name="autodetect" value="true" />
</bean>
<bean id="attributeSource"
class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
<bean id="assembler"
class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource" ref="attributeSource" />
</bean>
<bean id="namingStrategy"
class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
<property name="attributeSource" ref="attributeSource" />
</bean>
<bean class="myclass.jmx.DocumentMBean"
p:schedulerService-ref="documentService" />
<bean class="myclass.jmx.DocumentMXBean"
p:schedulerService-ref="documentService" />
MXBean可能是由容器类加载器加载的,而不是由web应用程序加载的。如果驱动程序位于应用程序库目录中,那么这将导致您看到的问题
如果是这种情况,请将驱动程序移动到tomcat/lib目录。感谢您的响应。此任务的要求要求我将所有jar文件放在应用程序的lib文件夹中。有没有一种方法可以授予MXBean访问这些jar文件的权限而不将它们移动到tomcat/lib文件夹中?顺便说一句,我试过你的建议,但没用。
try
{
// your codes here
// Get the current class-loader. This might be the class-loader from Tomcat
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
// Set the class-loader to be the one from the DO and not the one from Tomcat
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// your codes here
}
catch (Exception e)
{
// your codes here
}
finally
{
// Remember to set back the original class-loader
Thread.currentThread().setContextClassLoader(contextClassLoader);
}