Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置连接属性?_Java_Oracle_Jdbc - Fatal编程技术网

Java 如何设置连接属性?

Java 如何设置连接属性?,java,oracle,jdbc,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; ... Conn

我可以使用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();
但是现在我需要将选项设置为true。见第4-16页

因此,我尝试以下示例:

我将代码修改为:

  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

这种形式的
getConnection()
特定于
OracleDataSource
,在更通用的
DataSource
接口中不存在

解决方案很简单,请替换此行:

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

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

当然,这意味着从现在起,您的应用程序将只与Oracle数据库一起工作。取决于你需要什么,这可能是个好主意,也可能不是。

除了Alex的评论,我会试试

 conn = ds.getConnection();
 conn.setClientInfo("SetFloatAndDoubleUseBinary","true");

数据源
通常在应用服务器上配置。例如,在
Glassfish
中,您可以在管理控制台中设置此属性,如下所示:

然后打电话

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

编辑:

如果您想访问
javax.sql.DataSource
的实现类,应该使用方法而不是简单的强制转换

例如:

DataSource ds = (DataSource) ctx.lookup("jdbc/MyPool");
OracleDataSource oracleDS = ds.unwrap(OracleDataSource.class)  
确保类路径上有jdbc驱动程序jar

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

编辑2:

另外,有关
Glassfish
,请参阅《Oracle管理指南》。

这似乎是Oracle对
DataSource
的实现。您是否尝试将jndi上检索到的
DataSource
强制转换为
OracleDataSource
?例如:
((OracleDataSource)ds).setConnectionProperties(信息)
then
conn=ds.getConnection()
应该返回一个正确设置了属性的连接。谢谢Alex,它删除了编译错误,但由于运行时错误,我不确定该选项设置是否正确。请参阅上面的更新1。感谢biziclop,如果参数
info
,仍然像
conn=ds.getConnection(info)那样实现?我收到一个编译警告:
警告:[弃用]oracle.jdbc.pool.OracleDataSource中的getConnection(java.util.Properties)已弃用
。是否有其他方法来设置信息?忽略警告并运行更改也会产生与上述其他两种解决方案相同的错误:
堆栈跟踪:java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.DataSource40无法强制转换为oracle.jdbc.pool.OracleDataSource
@ggkmath Well,这意味着您正在阅读的文档不适合您试图应用它的场景。My GlassFish JDBC连接池的DataSourceName设置值为OracleDataSource。此外,还启用了Wrap JDBC对象选项。可能这与错误(?)有关。我执行了此处显示的操作,但
true
设置似乎没有被卡住,因为每当我尝试使用大于Oracle number数据类型支持的数字(1e127)设置Double时,就会出现溢出错误。如果变量为
true
则不应转换为数字。@ggkmath这些都是不完整的设置。您应该至少提供连接URL、用户和密码。显然,您的数据库供应商应该是Oracle。请确保您能够成功地ping创建连接池。好吧,也许我有点困惑。我已经在管理控制台资源/JDBC/JDBC连接池/myPool中创建了一个运行良好的JDBC连接池,我在附加参数选项卡中输入了所有必要的参数,包括用户名、pwd、Oracle供应商、,因此,我刚刚添加了SetFloatAndDoubleUseBaryBinary开关作为另一个属性,并重新启动了域,并在向数据库写入大量数字时观察到溢出错误(这意味着该开关未设置为true)。@ggkmath该属性应按照您在对此答案的第二条注释中所述的方式设置(即在连接池的附加参数中,以及其他连接设置,如用户、密码等)。您不能仅使用一个属性创建其他池。我不确定它为什么不起作用。我稍后会尝试此操作。至于您的更新,请参阅我的编辑。谢谢jFrenetic。我还尝试将
-Doracle.jdbc.SetFloatAndDoubleUseBinary=true
添加为Configurations/server config/JVM Settings/JVM Options屏幕中的选项。这就是va堆大小是和许多其他东西一起设置的。但这似乎也没有任何效果。