2012-03-07 26 views
5

昨日大きな問題が出てきました。私の現在のプロジェクトでは、接続用にOracle JDBCのojdbc6実装を使用していますが、このJARではまったく不可能なOracle 8データベースの例を扱う必要があります。 たとえば、いくつかのテストではojdbc14を使用するべきですが、後で同じベンダーの2種類のデータベースを処理する必要があると仮定しても構いませんが、既存の実装がないことがわかりますと私はそれらを持っている必要があります同時にがロードされています。同じインターフェイス(と同じインターフェイス、同じクラス構造、内部の異なる実装!)、同じURL接頭辞 - > JDBC接続は1つのドライバを使用しますが、それらの複数をロードすることはできません。ならどうしよう?同じベンダーの複数のJDBCドライバを扱う

  • 最初のアイデアは、異なるクラスローダーでJARをロードすることでした。同じクラスを別のクラスに分けて読み込むことができましたか?私は本当にそうは思わない、多分それは私のばかげた考えだった。私はクラスの実装の別の読み込みを行うことができたとしても

  • 教えてくださいまた、これは、単にJDBCドライバの一般的な問題後でない可能性があり、あなたは私の質問に答えることはできませんが、あなたがここに欠けているものを知っている場合でも、同じクラス名で、接続URLを作成するときにDriverManagerにどのように伝えることができますか? (私はjdbc:oracle:thinのような意味です)。

私は、これはJavaの世界に処理するために、完全に異常な考えではないと思うが、私は完全に処理する方法がわからないので、私は今、総ダムのように感じます。事前

+1

を私はOracleの8 *は*かなり尋常で使用して、知りません。 – skaffman

答えて

5

でy'allのための

ありがとうございます実際にオプションのカップルを持っている:

  1. あなたは異なるクラスローダからドライバをロードしようとすることができます。これは、アプリケーションで純粋なJDBCだけが必要な場合に機能します。私は、あなたがHibernateにそのような設定で作業させることを疑う。

    最終的には、両方のクラスローダーのインスタンスを表示する必要があるコードを実行する必要があります。ClassCastException(同じ完全修飾名を持つ2つのクラスは、異なるクラスローダーからロードされたときに異なります) 。

  2. アプリケーションを2つに分割できます。 2番目の小さなサーバーは、元のアプリケーションからコマンドを受け取り、それらをデータベースのJDBCに変換します。小規模なサーバーは、あなたのアプリケーションが1つのデータベースとしか通話していない間にOracle 8と通信します。

    この方法では、2つの問題を完全に別々に保つことができますが、2つのデータベースで結合を実行することはできません。

  3. CREATE DATABASE LINKを使用して、新しいデータベースに古いOracle 8データベースをリンクできます。これにより、古いデータベースが新しいデータベースの一部であるかのように見えるようになります。アプリケーションは1つのDBにのみ話し、Oracleは内部的に詳細を処理します。

    おそらくOracle 8はこれが機能するには古すぎるかもしれませんが、私は間違いなくそれを試してみます。

  4. Oracle JDBCドライバは、互換性があります。「このJARでは全く不可能です」と言うと、になりましたか?私は過去にOracle 7に接続するためにOracle 10ドライバを使用しました。すべての機能がサポートされているわけではありませんが、標準のクエリと更新を実行できます。その後、

+0

答えをありがとう。私は2番目が私たちの目的には遅すぎる、3は完全に受け入れられない(これは独立した場所を接続するためのいくつかの一般的なツールになります)、4。ええ、おそらく私はあなたの最初のコメントもし私が私たちのために十分なドライバで物事を乗り越えることができれば。 第4のアプローチの唯一の問題は、システム内にJDBCドライバを同時に持たずに、他のAPIが互換性に問題を抱えている可能性があり、次に2つまたは3つのバージョンが必要になることです。 – newhouse

+0

最初のコメントでは、同じクラス名で異なるドライバを読み込むことができるJDBCの場合を処理する方法を教えてくれませんでしたが、ドライバを個別にロードするDriverManagerの問題をどのように乗り越えることができますか私?同じURLを扱うように複数のドライバに指示することはできません。しかし、少なくともアプローチとアイデアが正しい方法であることはわかっています – newhouse

+0

解決策#1では明らかに 'DriverManager'を使用できません。 'DriverManager'はグローバル変数であり、親クラスローダから来て、各ドライバは同じベースURL(' jdbc:oracle: ')を使って自分自身をインストールしようとします。 OracleDataSourceを使用して手動で接続を作成する必要があります。 –

-1
#jdbc.properties 
oracle.driver=oracle.jdbc.OracleDriver 
oracle.url=jdbc:oracle:thin:@//localhost/xe 
oracle.user=scott 
oracle.password=tiger 

mysql.driver=com.mysql.jdbc.Driver 
mysql.url=jdbc:mysql://localhost/sales 
mysql.user=root 

mssql.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver 
mssql.url=jdbc:sqlserver://192.168.1.175;databaseName=sales 
mssql.user=dbviewer 
mssql.password=dbviewer 

そして、プロパティファイルを読み込む:

class QueryTest2 { 

    public static void main(String[] args) throws Exception{ 
     Properties settings = new Properties(); 
     FileInputStream fin = new FileInputStream("jdbc.properties"); 
     settings.load(fin); 
     fin.close(); 
     String dvr = settings.getProperty(args[0] + ".driver"); 
     String url = settings.getProperty(args[0] + ".url"); 
     String usr = settings.getProperty(args[0] + ".user"); 
     String pwd = settings.getProperty(args[0] + ".password"); 
     Class.forName(dvr); 
     Connection con = DriverManager.getConnection(url, usr, pwd); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("select pno,price,stock from products"); 
     while(rs.next()){ 
      System.out.printf("%d\t%.2f\t%d%n", rs.getInt(1), rs.getDouble(2), rs.getInt("stock")); 
     } 
     rs.close(); 
     stmt.close(); 
     con.close(); 
    } 
} 
+0

このプロパティファイルは次のように追加してください--- –

関連する問題