在我的Spring Boot应用程序中,我实现了这个类来调用存储过程。该存储过程的输入参数之一是数组。为了传入数组,需要OracleConnection。以下是执行此操作的代码:
@Component
@Transactional
public class FmTrfUtil {
static int returnVal;
@PersistenceContext
private EntityManager em;
public int insertFmTrfs(List<String> trfs, String source) {
Session session = em.unwrap( Session.class );
final String[] trfArray = trfs.toArray(new String[trfs.size()]);
final String src = source;
session.doWork( new Work(){
public void execute(Connection conn) throws SQLException {
CallableStatement stmt = null;
OracleConnection oraCon = conn.unwrap(OracleConnection.class);
Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setArray(2, array);
stmt.setString(3, src);
stmt.execute();
returnVal = stmt.getInt(1);
}
});
return returnVal;
}
}
在IDE中进行测试时,它可以正常工作,其中在Spring配置文件(application.properties)中显式指定了jdbc连接。但是,当我使用jndi查找数据源在我们的开发服务器上部署战争时,我在此行java.sql.SQLException: Object does not wrap anything with requested interface
收到错误OracleConnection oraCon = conn.unwrap(OracleConnection.class);
。这可能表示Connection
实例无效。其他不需要Connection
的休息呼叫仍然有效,但这意味着jndi确实在工作。
数据源在tomcat 7的context.xml中设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context crossContext="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" maxActive="10" maxIdle="10" maxWait="-1"
name="jdbc/ristoredb" password="ristoreowner987" type="javax.sql.DataSource" username="ristore_owner"
url="jdbc:oracle:thin:@ldap://mdaoid.xxx.org:389/risdev3,cn=OracleContext,dc=ac,,dc=org"
/>
</Context>
我在application.properties中配置了jndi名称:
spring.datasource.jndi-name=jdbc/ristoredb
似乎获取jdbc Connection不能与JNDI一起使用。检索OracleConnection的正确方法是什么?如果这不起作用,是否有将数组传递到Oracle存储过程的替代方法?