如何使用JNDI查找获取OracleConnection

时间:2016-11-10 17:16:39

标签: oracle tomcat jdbc spring-boot jndi

在我的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存储过程的替代方法?

0 个答案:

没有答案