我正在尝试使用dbcp框架为我的oracle服务器建立连接池。 我使用此tutorial进行连接。 问题是使用此连接创建OraclePreparedStatement:
Connection oracleCon;
OraclePreparedStatement o_stmt;
String sql = "INSERT INTO T002_metadata (T002_datacitexml,T002_version, T002_active) VALUES (?,?,?) RETURNING T002_id INTO ?";
oracleCon = ConnectionManager.ds.getConnection();
o_stmt = ((OraclePreparedStatement) oracleCon.prepareStatement(sql));
执行此操作后,将抛出异常。
org.apache.commons.dbcp.DelegatingPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement
是否有可能发表声明?
答案 0 :(得分:2)
不是Oracle课程,不是。这就是JDBC的用途。这是一个API。仅使用java.sql.PreparedStatement。通过尝试向下转换,你违反了多态性并破坏了这样的事情,其中一个库包装真实的连接和语句,为你提供一些额外的服务。
答案 1 :(得分:1)
我今天遇到了同样的问题,并通过改变Tomcat配置来解决它here。
我通过更改类型和工厂属性更改了context.xml
文件:
....
<Resource name="jdbc/dsName"
auth="Container"
type="oracle.jdbc.pool.OracleDataSource"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
user="username"
password="password"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbcurl"/>
....
还必须更改web.xml
文件中的资源定义
....
<resource-ref>
<description>Oracle datasource</description>
<res-ref-name>jdbc/test</res-ref-name>
<!-- <res-type>javax.sql.DataSource</res-type>-->
<res-type>oracle.jdbc.pool.OracleDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
....
我的代码中没有任何更改。
答案 2 :(得分:0)
如果您正在使用Oracle,则可以将连接转换为OracleConnection,然后进行转换 您准备好的OraclePreparedStatement语句。 jdbc所做的是将Oracle对象向上转换为标准sql对象,但它们仍然是Oracle sql对象。
答案 3 :(得分:0)
我使用实用程序方法
public static OraclePreparedStatement getOraclePreparedStatement(PreparedStatement stmt) {
if (stmt instanceof OraclePreparedStatement) {
return (OraclePreparedStatement) stmt;
}
if (stmt instanceof DelegatingPreparedStatement) {
DelegatingPreparedStatement stmt1 = (DelegatingPreparedStatement) stmt;
return (OraclePreparedStatement) stmt1.getInnermostDelegate();
}
System.out.println(stmt);
throw new RuntimeException("unknown statement");
}
从本质上讲,它允许独立使用相同的代码(例如在测试中)或在tomcat中使用。我使用它而不是强制转换,因此代码不会更长。
try (OraclePreparedStatement stmt = getOraclePreparedStatement(con.prepareStatement(SQL_INSERT_TREATMENT))) {
...
}