Java 如何设置连接属性?
我可以使用JDBC驱动程序和以下Java代码很好地连接到Oracle 11.2数据库: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
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(信息)
thenconn=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堆大小是和许多其他东西一起设置的。但这似乎也没有任何效果。