java - 如何设置连接属性?

标签 java oracle jdbc

我可以使用 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

给出以下运行时错误:

堆栈跟踪:java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.DataSource40 无法转换为 oracle.jdbc.pool.OracleDataSource

最佳答案

DataSource 通常配置在应用服务器上。例如,在 Glassfish 中,您可以像这样在管理控制台中设置此属性:

enter image description here

然后打电话

ds.getConnection() 来自您的客户端代码。

编辑:

如果你想访问javax.sql.DataSource的实现类,你应该使用DataSource#unwrap方法而不是简单的转换。

例如:

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

确保您的 jdbc 驱动程序 jar 位于类路径中。

但是如果您将来希望切换到另一个数据库供应商,那么您的代码将是不可移植的。

编辑 2:
此外,对于 Glassfish,请参阅 Configuring Specific JDBC Connection Pool Features Oracle 管理指南。

关于java - 如何设置连接属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148976/

相关文章:

Java奇怪的方法

java - 如何使用 Hibernate 正确映射 MonetaryAmount?

oracle - 通过ORACLE SQL LOADER导入CSV,双引号换行

sql - 由 SQL 解析引起的 Oracle 响应延迟

java - JDBC(微软SQL服务器): No suitable driver found for url

java.io.NotSerializedException : com. mysql.jdbc.DatabaseMetaData

java - Hibernate缓存锁定错误

java - 如何在 Struts2 中使用 anchor 而不是提交按钮?

oracle - 使用内部连接在 oracle 中获取特定列值计数

java - 在 JBoss DB 源配置中获取 "ORA-12514, TNS:listener does not currently know of service requested in connect descriptor"