我可以使用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
答案 0 :(得分:3)
DataSource
通常在应用程序服务器上配置。例如,在Glassfish
中,您可以在管理控制台中设置此属性,如下所示:
然后只需致电
来自客户端代码的 ds.getConnection()
。
修改:
如果您想要访问javax.sql.DataSource
的实现类,则应使用DataSource#unwrap方法而不是简单的强制转换。
例如:
DataSource ds = (DataSource) ctx.lookup("jdbc/MyPool");
OracleDataSource oracleDS = ds.unwrap(OracleDataSource.class)
确保你在classpath上有你的jdbc驱动程序jar。
但是,如果您希望将来切换到其他数据库供应商,那么您的代码将是不可移植的。
编辑2:
另外,对于Glassfish
,请参阅Oracle管理指南的Configuring Specific JDBC Connection Pool Features。
答案 1 :(得分:1)
此getConnection()
形式特定于OracleDataSource
,并且在更通用的DataSource
界面中不存在。
解决方案很简单,请替换此行:
DataSource ds = (DataSource)context.lookup("jdbc/myPool");
用这个:
OracleDataSource ds = (OracleDataSource)context.lookup("jdbc/myPool");
当然,这意味着从现在开始,您的应用程序将仅适用于Oracle数据库。根据您的需要,这可能是一个好主意,也可能不是。
答案 2 :(得分:0)
除了Alex的评论,我还会尝试
conn = ds.getConnection();
conn.setClientInfo("SetFloatAndDoubleUseBinary","true");