3

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

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>

誰がこれがどこから来たのか手がかりを持っていますか?

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

乾杯、

マイケル

4

6 に答える 6

1

@Michaelええと、java.sql.Connectionはインターフェースです-JBossから取得する具体的な実装をシリアル化できるようにすることは技術的に可能かもしれません-しかし、実際に使用できるオプションはないと思います。可能であれば、おそらく簡単でしょう:)

@toolkitは、VMの外部で使用できる正しい言葉を言っていると思います-JDBCドライバーは、基盤となるOSで実行されているネイティブドライバーコードと通信するため、ネットワーク経由で接続を渡すことができない理由を説明できるかもしれません他の場所。

私のアドバイス(これ以上のアドバイスが得られない場合)は、別のアプローチを見つけることです。JBossディレクトリでリソースを見つけるためのアクセス権がある場合は、ディレクトリから見つけて取得できるプロキシオブジェクトを実装することもできます。これにより、ファットクライアントからリモートで接続を使用できるようになります。これはデータ転送オブジェクトと呼ばれるデザインパターンです。ウィキペディアのエントリだと思います

于 2008-09-03T13:03:38.690 に答える
1

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

JBoss データソース構成

DataSource ラッパーは、サーバー VM の外部では使用できません

于 2008-09-02T13:29:15.937 に答える
0

例外は、取得しようとしているSQLConnectionオブジェクトがSerializableインターフェイスを実装していないため、要求した方法で渡すことができないことを示していると思います。

私がJDNIで行った限られた作業から、JNDIを介してオブジェクトを要求する場合は、シリアル化可能である必要があります。私の知る限り、それを回避する方法はありません-もっと良い方法を考えたら、それを投稿します...

OK、明らかなオプションの1つは、それを使用するデータソースのローカルにシリアル化可能なオブジェクトを提供することですが、そのシリアル化可能なオブジェクトグラフの一部としてデータソースを持っていません。ファットクライアントは、そのオブジェクトを検索して、代わりにクエリを実行できます。

または、データソースにアクセスするための(Web?)サービスを作成します。これもファットクライアントがサービスにアクセスします。懸念がある場合は、これをより適切にカプセル化し、より再利用可能なアプローチにすることができます。

于 2008-09-02T10:04:02.420 に答える
0

JBoss はすべての DataSource を独自のものでラップします。

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

私はそれのラッパーを注意深く見ます。JBoss の JDBC 用 J2EE ラッパー ラッパーのサロゲートを作成しました。このラッパーは、OOCJNDI と連携して、DAO コード ユニット テスト可能なスタンドアロンを取得します。

java.sql.Driver をラップし、クラスに OOCJNDI を指定して、JUnit で実行するだけです。

ドライバー ラッパーは、SQL ドライバーを直接作成し、それに委譲することができます。

Connect で独自に考案した java.sql.Connection ラッパーを返します。

ConnectionWrapper は、Oracle ドライバーが提供する Connection をラップするだけでよく、Autocommit を true に設定するだけです。

Eclipse がデリゲートを作成できることを忘れないでください。委任する必要があるメンバーを追加し、それを選択して右クリックし、ソース -=> 委任メソッドを追加します。

これは、ラインで支払われる場合に最適です;-)

Bada-bing、Bada-boom、JUnit のすぐに使える J2EE テスト。

あなたの問題は、JUnit が取り消し線で囲まれ、FatCLient がクレヨンで書かれているという、おそらく同じことの影響を受けやすいでしょう。

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

于 2008-09-10T23:38:13.297 に答える
0

@toolkit: まあ、正確ではありません。JNDI 経由でデータ ソースにアクセスできるため、実際にデータ ソースを表示して使用できます。

それとも、私は何か完全に間違っていますか?

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

于 2008-09-02T14:42:44.713 に答える
0

私は今Ibatisについて読みました.Daoなどの実装をシリアライズ可能にし、それらをディレクトリに投稿して、それらを取得してファットクライアントで使用できますか? そこからも再利用のメリットが得られます。

これは、 Wicketに似たものの例です。

于 2008-09-03T17:39:09.510 に答える