Java 无法通过JBoss远程访问数据源

Java 无法通过JBoss远程访问数据源,java,jboss,datasource,jndi,Java,Jboss,Datasource,Jndi,上下文 我有一个JBoss,在那里我成功地部署了一个datasourcemydatasource ds.xml。 它的JNDI名称是java:mydatasourceDS。JBoss声称数据源已成功部署。JMX控制台也在运行 问题 我想从一个单独的JVM上启动的客户端java应用程序中使用这个数据源。 但是我得到一个异常,说找不到java:mydatasourceDS java.lang.ClassCastException: javax.naming.Reference cannot be c

上下文

我有一个JBoss,在那里我成功地部署了一个datasource
mydatasource ds.xml
。 它的JNDI名称是
java:mydatasourceDS
。JBoss声称数据源已成功部署。JMX控制台也在运行

问题

我想从一个单独的JVM上启动的客户端java应用程序中使用这个数据源。 但是我得到一个异常,说找不到
java:mydatasourceDS

java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.sql.DataSource
详细信息

以下是
persistence.xml
文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="mydatasource-db" transaction-type="JTA">
    <jta-data-source>java:mydatasourceDS</jta-data-source>
    <properties>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.default_schema" value="rec" />

        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    </properties>
</persistence-unit>
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
以下是应用程序类路径:

jndi.properties
log4j.properties
META-INF\persistence.xml
hibernate-jpa-2.0-api-1.0.0.Final.jar
jnp-client-5.0.3.GA.jar
jboss-common-core-2.2.14.GA.jar
jboss-logging-spi-2.1.0.GA.jar
hibernate-entitymanager-3.6.4.Final.jar
hibernate-core-3.6.4.Final.jar
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-3.2.0.Final.jar
jta-1.1.jar
javassist-3.12.0.GA.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
log4j-1.2.16.jar
xstream-1.4.1.jar
xmlpull-1.1.3.1.jar
xpp3_min-1.1.4c.jar
编辑 我已经找到了问题的根源。我的客户端应用程序可用的
javax.sql.DataSource
不是从JNDI收到的。我从JNDI收到的是JBoss
javax.sql.DataSource
。名称相同,但类略有不同,因此出现ClassCastException

在撰写本文时,JBoss javax.sql.DataSource可以在这个包中找到:JBoss-j2ee-4.2.3.GA.jar

说您必须设置

<use-java-context>false</use-java-context>
false
mydatasource ds.xml
中。不知道你有没有。如果你有

javax.naming.Reference 
这意味着您缺少it解析所需的运行时依赖项。您可以通过检查引用对象的classFactory成员

getFactoryClassName() 
找出您缺少的第一个依赖项

在我使用JBoss6.1的情况下,它是:

org.jboss.resource.adapter.jdbc.remote.DataSourceFactory
将这个类所在的jar放在类路径(
common/lib/jbosscx client.jar
)中,让我通过了第一步,然后就是跟踪所有ClassNotFoundException错误

JBoss6.1的完整列表是:

- client/jnp-client.jar
- client/jboss-logging.jar
- common/lib/jbosscx-client.jar
- client/concurrent.jar
- client/jboss-client.jar
- client/jboss-common-core.jar
- client/jboss-integration.jar
- client/jboss-remoting.jar
- client/jboss-security-spi.jar
- client/jboss-serialization.jar
- client/jboss-transaction-api_1.1_spec.jar

谢谢你的建议。在指南中的一条评论中,有人说,当连接池已满时,将无法建立更多的连接。我们如何解决这个问题?您必须确保应用程序池中有足够的连接。数量取决于您的环境。如果池已满,池管理器将等待一定时间,直到重试。确保在使用完每个连接后都将其关闭。您还可以定义仅由客户端使用的第二个数据源。我现在可以检索数据源,但我有一个CCE:\
java.lang.ClassCastException:javax.naming.Reference不能转换为javax.sql.datasource
我已经阅读了此资源。我将postgresql jar放在类路径中,但没有运气。我也找到了这个:。也不走运。您确定在类路径中有一个包含数据源实现/接口的jar文件吗?看来光靠司机是不够的。很高兴知道你解决了这个问题:不是真的。我已经找到了根本原因,但我无法解决它。我怎样才能从JDK中去掉javax.sql.DataSource而使用JBoss中的数据源呢?我可以从类路径中删除rt.jar,但我需要java.lang.String:-o