2008-09-02 19 views
3

コンテナの外部のファットクライアントからWebコンテナ(JBoss)内で定義されたデータソースにアクセスしようとしています。Webコンテナ(JNDI経由)からデータソースにアクセス

私はJNDIを通じてデータソースを調べることに決めました。実際、私の永続性フレームワーク(Ibatis)はこれを行います。

クエリを実行する私はいつもこのエラーを取得して終了する場合:

java.lang.IllegalAccessException: Method=public abstract java.sql.Connection java.sql.Statement.getConnection() throws java.sql.SQLException does not return Serializable 

Stacktrace: 
org.jboss.resource.adapter.jdbc.remote.WrapperDataSourceService.doStatementMethod(WrapperDataSourceS 
ervice.java:411), 
org.jboss.resource.adapter.jdbc.remote.WrapperDataSourceService.invoke(WrapperDataSourceService.java 
:223), 
sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source), 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25), 
java.lang.reflect.Method.invoke(Method.java:585), 
org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155), 
org.jboss.mx.server.Invocation.dispatch(Invocation.java:94), 
org.jboss.mx.server.Invocation.invoke(Invocation.java:86), 
org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264), 
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659), 

マイデータソース:

<?xml version="1.0" encoding="UTF-8"?> 
<datasources> 
    <local-tx-datasource> 
     <jndi-name>jdbc/xxxxxDS</jndi-name> 
     <connection-url>jdbc:oracle:thin:@xxxxxxxxx:1521:xxxxxxx</connection-url> 
     <use-java-context>false</use-java-context> 
     <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> 
     <user-name>xxxxxxxx</user-name> 
     <password>xxxxxx</password> 
     <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> 
     <min-pool-size>5</min-pool-size> 
     <max-pool-size>20</max-pool-size> 
    </local-tx-datasource> 
</datasources> 

誰もが、これはから来る可能性が手掛かりを持っていますか?

誰かがこれを達成するためのより良い方法を知っているかもしれません。 ヒントは大歓迎です!

乾杯、

マイケル

答えて

0

私は例外はそれが道あなたにあなたに渡すことはできませんので、あなたが取得しようとしているSQLConnectionオブジェクトは、Serializableインタフェースを実装していないことを示していると思いますそれを求めた。

私はJDNIで行った限られた作業から、JNDI経由でオブジェクトを要求している場合は、シリアル化可能でなければなりません。私が知る限り、これ以上の方法はありません - 私はそれを投稿するより良い方法を考えるなら...

OK、ひとつの明白な選択肢は、それを使用するデータソースに対してローカルな直列化可能なオブジェクトを提供することですシリアライズ可能なオブジェクトグラフの一部としてデータソースを持っていません。ファットクライアントは、そのオブジェクトを検索して代わりにそれを照会することができます。

また、データソースにアクセスするための(Web?)サービスを作成します。これは、ファットクライアントがサービスにヒットすることになります。これは、おそらくカプセル化され、再利用可能なアプローチになります。

1

これが同じ問題であるかどうかわかりませんか?

JBoss DataSource config

DataSource wrappers are not usable outside of the server VM

0

@toolkit: まあ、ない正確に。私はJNDIを介してデータソースにアクセスすることができるので、実際に可視であり、使用可能です。

まったく間違っていますか?

@Brabster: あなたは正しい方向にいると思います。接続をシリアライズ可能にする方法はありませんか?たぶんそれは単なる設定上の問題かもしれません...

1

@Michaelまあ、java.sql.Connectionはインターフェイスです - JBossから取得している具体的な実装が技術的に可能である可能性がありますが、私はそうではありませんあなたが実際に使用できるオプションを持っていると思います。可能であれば、それはおそらく簡単だろう:)

私は@ツールキットは、VMの外で使用可能な右の言葉を言っているかもしれないと思う - JDBCドライバは、根底にあるOSで実行されているネイティブドライバコードと話すだろうと思う、他の場所でネットワーク経由で接続できない理由を説明しています。

JBossディレクトリでリソースを見つけるためのアクセス権があれば、別の方法を見つけることができます(おそらく、より良いアドバイスを得ることができます)。ファットクライアントからリモートで接続を使用できるようにするディレクトリから取得します。それはデータ転送オブジェクトと呼ばれるデザインパターンだと思います。Wikipedia entry

0

あなたはDaoなどのシリアライズ可能なものを実装し、それらをあなたのディレクトリに投稿して検索し、太ったクライアント?あなたはそれでも再利用のメリットを得るでしょう。

ここで何かの例ですが、Wicket

0

のために似ていますJBossは、それ自身のもので、すべてのデータソースをラップします。

これにより、自動コミットを使用してトリックを実行して、指定されたJ2EE動作をJDBC接続から取得できます。彼らは、ほとんどが可能です。しかし、あなたはそれらを信頼する必要はありません。

私はラッパーを注意深く見ています。私はDAOコードユニットをテスト可能なスタンドアロンにするために、OOCJNDIで動作するJBossのJ2EEラッパーラッパー(JDBC用)の代理文を作成しました。

あなたは自分のクラスでに、java.sql.driver、ポイントOOCJNDIをラップ、とJUnitで実行されます。

ドライバーラッパーは、SQLドライバーを直接作成し、そのドライバーに委任できます。

接続時に自分の開発したjava.sql.Connectionラッパーを返します。

ConnectionWrapperは、Oracleドライバが提供するConnectionをラップするだけで、 という特殊な機能はすべてAutoCommit trueに設定されます。

忘れないでください。Eclipseがあなたに代わって作成することができます。委任する必要があるメンバーを追加し、それを選択して右クリックし、source = =>デリバリーメソッドを追加します。あなたが行;-)

バダ - ビング、バダ・ブーム、ボックスJ2EEテストのうちのJUnitによる支払いを受けるとき

これは素晴らしいです。

あなたの問題はおそらく、JUnitが省略され、FatCLientがクレヨンで書かれているのと同じことが起こりやすいでしょう。

My FatClientは、xdocletで生成されたRMIを使用してJ2EEサーバーと通信するため、問題はありません。

関連する問題