2011-12-22 41 views
3

語境無法通過遠程JBoss的

訪問數據源,我有一個JBoss,我已經成功部署了數據源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> 

這裏是jndi.properties文件:

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

+0

很高興知道你解決了它:D – oers 2011-12-22 19:50:04

+0

好不是真的。我找到了根本原因,但我無法解決它。我如何擺脫JDK中的javax.sql.DataSource來支持JBoss中的javax.sql.DataSource?我可以從類路徑中刪除rt.jar,但我需要java.lang.String:-o – Stephan 2011-12-24 02:32:46

回答

2

This guide說,你必須設置

<use-java-context>false</use-java-context> 

mydatasource-ds.xml。不知道你是否做過。

+0

Tks爲您的建議。在該指南的其中一條評論中,有人說當連接池已滿時,不能建立更多的連接。我們如何解決這個問題? – Stephan 2011-12-22 10:56:54

+0

您必須確保您的應用程序在池中有足夠的連接。有多少取決於你的環境。如果池已滿,則池管理器將等待一段時間,直到重新嘗試。確保在使用後關閉所有連接。您還可以定義僅由客戶端使用的第二個數據源。 – oers 2011-12-22 11:05:19

+0

我現在可以檢索DataSource,但是我有一個CCE:\ 'java.lang.ClassCastException:javax.naming.Reference不能轉換爲javax.sql.DataSource' – Stephan 2011-12-22 12:12:14

3

如果你得到一個

javax.naming.Reference 

這意味着你缺少的是它來解決,需要運行時依賴。您可以通過

getFactoryClassName() 

來檢查參考對象的classFactory成員,以找出您缺少的第一個依賴關係。

在我的使用情況JBoss6.1是:

org.jboss.resource.adapter.jdbc.remote.DataSourceFactory 

把罐子這個類是在類路徑(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