5

JDBC ドライバーと次の Java コードを使用して、Oracle 11.2 データベースに正常に接続できます。

  import java.sql.*;
  import javax.sql.DataSource;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import oracle.jdbc.OracleTypes;
  ...
  Connection conn=null;

  // connect to database
  Context context = new InitialContext();
  DataSource ds = (DataSource)context.lookup("jdbc/myPool");
  conn = ds.getConnection();

ただし、オプションSetFloatAndDoubleUseBinaryを true に設定する必要があります。4-16ページはこちら

http://docs.oracle.com/cd/E14072_01/java.112/e10589.pdf

だから私はここから例に従おうとします:

http://docs.oracle.com/cd/E11882_01/java.112/e16548/urls.htm

コードを次のように変更します。

  import java.sql.*;
  import java.util.Properties;
  import javax.sql.DataSource;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import oracle.jdbc.OracleTypes;
  ...
  Connection conn=null;

  // set connection properties
  Properties info = new java.util.Properties();
  info.put ("SetFloatAndDoubleUseBinary","true");

  // connect to database
  Context context = new InitialContext();
  DataSource ds = (DataSource)context.lookup("jdbc/myPool");
  conn = ds.getConnection(info);

次のコンパイルエラーが発生します。

myClass.java:1145: cannot find symbol
symbol  : method getConnection(java.util.Properties)
location: interface javax.sql.DataSource
          conn = ds.getConnection(info);
                   ^

ここで適切に設定する方法を知っている人はSetFloatAndDoubleUseBinaryいますか?

更新 1

変更:

  import java.sql.*;
  import java.util.Properties;
  import javax.sql.DataSource;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import oracle.jdbc.OracleTypes;
  import oracle.jdbc.*;       // NEW
  import oracle.jdbc.pool.*;  // NEW
  ...
  Connection conn=null;

  // set connection properties
  Properties info = new java.util.Properties();
  info.put ("SetFloatAndDoubleUseBinary","true");

  // connect to database
  Context context = new InitialContext();
  DataSource ds = (DataSource)context.lookup("jdbc/myPool");
  ((OracleDataSource)ds).setConnectionProperties(info); // NEW
  conn = ds.getConnection();                    // NEW

次の実行時エラーが発生します。

stack trace: java.lang.ClassCastException: com.sun.gjc.spi.jdbc40.DataSource40 cannot be cast to oracle.jdbc.pool.OracleDataSource

4

3 に答える 3

3

DataSource通常、アプリケーション サーバー上で構成されます。たとえばGlassfish、管理コンソールでこのプロパティを次のように設定できます。

ここに画像の説明を入力

そして、ただ電話する

ds.getConnection()クライアントコードから。

編集:

の実装クラスにアクセスしたい場合は、単純なキャストではなく DataSource#unwrapjavax.sql.DataSourceメソッドを使用する必要があります。

例えば:

DataSource ds = (DataSource) ctx.lookup("jdbc/MyPool");
OracleDataSource oracleDS = ds.unwrap(OracleDataSource.class)  

jdbc ドライバー jar がクラスパスにあることを確認してください。

ただし、将来別のデータベース ベンダーに切り替えたい場合、コードは移植できなくなります。

編集 2:
また、については、 Oracle 管理ガイドの特定の JDBC 接続プール機能の構成Glassfishを参照してください。

于 2012-08-27T20:41:46.560 に答える
2

この形式のgetConnection()は固有のものであり、より一般的なインターフェイスOracleDataSourceには存在しません。DataSource

解決策は簡単です。次の行を置き換えます。

DataSource ds = (DataSource)context.lookup("jdbc/myPool");

これとともに:

OracleDataSource ds = (OracleDataSource)context.lookup("jdbc/myPool");

もちろん、これは今後アプリケーションが Oracle データベースでのみ動作することを意味します。必要なものに応じて、これは良い考えかもしれませんし、そうでないかもしれません。

于 2012-08-27T20:29:48.693 に答える
0

アレックスのコメントに加えて、試してみます

 conn = ds.getConnection();
 conn.setClientInfo("SetFloatAndDoubleUseBinary","true");
于 2012-08-27T20:31:34.727 に答える