我有一个Tomcat 7 Web应用程序,它使用jt400 JDBC驱动程序连接到在iSeries V6R1上运行的DB2。多年来我一直在使用相同的设置,几乎没有问题。使用我的context.xml中设置的JNDI连接和WEB-INF / lib文件夹中的驱动程序,一切都按预期工作,JPA查询和其他所有内容。
我现在正在尝试使用调用RPG程序的存储过程。当我使用JNDI连接时,它会错误地说它无法找到外部程序。如果我使用完全相同(复制和粘贴)的连接字符串,驱动程序,用户名和密码创建新的JDBC连接,它可以完美地工作。从SQuirreL运行时,相同的存储过程也可以正常工作。
使用JNDI连接我收到以下错误:
[SQL0444] External program xxx in *LIBL not found
这是我的(已清理的)连接字符串:
jdbc:as400:server;naming=system;prompt=false;datetime=iso;libraries=SYSIBM OTHER LIBS AS NEEDED
这是我的代码:
CallableStatement cs=null;
// Fails every time
// Connection conn = getJNDIConnection();
// Works every time
Connection conn = getNewJDBCConnection();
cs = conn.prepareCall("CALL MY_PROC ( 0, 'TEST' )");
cs.execute();
我真的很想依靠JNDI连接而不是创建自己的连接,但我必须使用该解决方法,除非有人知道导致此错误的原因。
谢谢,
约翰
答案 0 :(得分:0)
* LIBL是一个线索。什么设置了JNDI连接的库列表?
另一个要看的地方是签名。当您通过JNDI调用存储过程时,您使用与使用SQuirreL时完全相同的参数类型和长度吗?特别要注意CHAR参数和VARCHAR参数之间的区别。