关于类加载的问题,求大神赐教 在线等候答复
背景:问题所在项目使用java语言 ,发布在WebSphere上 ,具体版本我不清楚,有专门人员发布测试环境。功能是从一个系统的oracle数据库中取得相关数据插入到另一个系统的sql server数据库中,连接程序如下:
// cms提交连接
IDataBaseConn tIDataBaseConn = new IDataBaseConn();
Connection conn = tIDataBaseConn.newOrclConn("CMS");
PubSubmit mPubSubmitCms = new PubSubmit(conn);
MMap mmap = submitLocalBKEconomyInfoToCMS(tBKEconomyInfoSet);
mCmsVData.addElement(mmap);
// 提交数据库
if (!mPubSubmitCms.submitData(mCmsVData, "")) {
this.mErrors.copyAllErrors(mPubSubmitCms.mErrors);
System.out.println("提交数据失败,原因是"
+ mPubSubmitCms.mErrors.getFirstError());
return false;
}
现在的问题是:
这个类在本机操作很正常,发布到测试环境后就会报错,查了测试环境的日志显示下面的错误提示:
9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:573)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:477)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:373)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at java.lang.ClassLoader.loadClass(ClassLoader.java:561)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.db2.jcc.c.bu.<init>(bu.java:61)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.db2.jcc.c.l.D(l.java:1562)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.db2.jcc.a.b.<init>(b.java:199)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:131)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at java.sql.DriverManager.getConnection(DriverManager.java:562)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at java.sql.DriverManager.getConnection(DriverManager.java:186)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.sinosoft.jbs.inte易做图cedataprocess.IDataBaseConn.newOrclConn(IDataBaseConn.java:47)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.sinosoft.jbs.settle.BKEconomyInfoImpl2.submitDataCms(BKEconomyInfoImpl2.java:80)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R at com.sinosoft.jbs.inte易做图cedataprocess.IAntiWirteIngeniumUI.submitData(IAntiWirteIngeniumUI.java:60)
[9/11/13 10:20:40:012 CST] 0000023d SystemErr R ... 33 more
之前还没有出现这个问题,测试环境下的jar包以及其他的东西都没有动,只是我提交了一个java类(BKEconomyInfoImpl2.java)后重新编译了一下,而且在本机上运行就不会报任何错误。从报错上看是数据库连接的问题,但是调用的这些连接程序都是基础的公共java类一直都这样调用也没有错。
实在不知道该怎么解决了,请大家帮帮我啊,非常着急。万分感谢啊。。
--------------------编程问答-------------------- 笨方法:
写两个JSP分别用JDBC连接两个数据库,拿到WebSphere测试环境里运行一下看看是否运行正常。
再排查其他原因 --------------------编程问答--------------------
嗯 我有一个问题不明白,就是我用本机上的程序连测试环境的数据库运行时没有任何问题, 而我通过浏览器直接访问测试环境发布后的地址后就会报上面的错误,这两种方法有什么区别吗?数据库和程序都是相同的啊,为什么还有不同的结果呢? --------------------编程问答-------------------- 可能是路径不对,哪个数据库没连接上 --------------------编程问答--------------------
不知道你说的路径是指什么,就是我要插入数据的sql server数据库连接出现了问题。但是现在确定的是要连接的数据库的路径,用户名,密码都是正确的。 --------------------编程问答-------------------- 远程debug跑一下看看 --------------------编程问答-------------------- 你从oracle取数据插到MS sql server,怎么会出一个IBM db2的driver exception?
你看一下是不是websphere上的数据源配置的类型搞错了啊 --------------------编程问答-------------------- 可能是你写的那个类中获取数据库配置文件的代码有问题,导致在测试环境无法创建连接。
如果是这样,那么根本的原因就是类加载路径问题。在本地开发环境可以正常运行,那是因为jvm启动的路径就是你的开发环境中的目录,jvm可以找到配置文件,但是换了环境,jvm就找不到配置文件了。
举个例子:你的开发环境(eclipse的workspace路径是D:\workspace),工程名称为test,那么你在开发的时候,jvm实际路径是D:\workspace\test\bin(class文件所在文件夹)。你的配置文件A放在src下。那么java会到D:\workspace\test\bin中去找A,这样是可以找到的。但是现在你把这个工程放到别的电脑上,别的电脑启动工程的地方是C:\xxx,那么java会到C:\xxx中去找A,而不是你想要的在工程test\bin中找A。
写的有点乱,不过大概意思就是说文件路径有问题。
这个问题也是很多人在eclipse中可以运行工程,但是打包成可执行jar后就出现无法运行的主要原因之一。
补充:Java , Java EE