Hello I am run a webapp under tomcat that also runs under websphere and weblogic. I have identified changes to war and code needed to handle the jdni issues as well as differences in configuration of web services between the three containers.
The issue I am having (it seems strange and not believable) is a problem with code that works under the web* containers and does not seem to work under tomcat 7. The following are log out puts from web* and tomcat they show that the driver being used via jdbc pooling is the same driver. Weblogic/WebSphere log entries showing oracle driver 2011.02.22 05:00:22,602 Database Name: reportwriter 2011.02.22 05:00:22,602 Database Username: weblogic 2011.02.22 05:00:22,715 Database connection properties 2011.02.22 05:00:22,716 ------------------------------ 2011.02.22 05:00:22,716 Database Connection URL: jdbc:oracle:thin:@ssi-allmatch:1521:reporting 2011.02.22 05:00:22,716 Database User Name: SYSTEM 2011.02.22 05:00:22,716 Database Product Name: Oracle 2011.02.22 05:00:22,717 Database Product Version: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 2011.02.22 05:00:22,717 Database Driver Name: Oracle JDBC driver 2011.02.22 05:00:22,717 Database Driver Version: 11.1.0.7.0-Production 2011.02.22 05:00:23,36 Language repositories have been populated successfully. Log entries using Tomcat 7 2011.02.22 05:20:59,627 Database Name: reportwriter 2011.02.22 05:20:59,627 Database Username: tomcat 2011.02.22 05:21:00,46 Database connection properties 2011.02.22 05:21:00,46 ------------------------------ 2011.02.22 05:21:00,46 Database Connection URL: jdbc:oracle:thin:@ssi-allmatch:1521:reporting 2011.02.22 05:21:00,46 Database User Name: SYSTEM 2011.02.22 05:21:00,46 Database Product Name: Oracle 2011.02.22 05:21:00,47 Database Product Version: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 2011.02.22 05:21:00,47 Database Driver Name: Oracle JDBC driver 2011.02.22 05:21:00,47 Database Driver Version: 11.1.0.7.0-Production 2011.02.22 04:57:05,280 Language repositories have been populated successfully. When I start up web* I get the following log segment 2011.02.22 05:29:20,1 Initializing reporting object. 2011.02.22 05:29:20,91 ReportWriter Web application initialization has been completed. When I start up Tomcat I get the following error 2011.02.22 05:21:04,193 Initializing reporting object. 2011.02.22 05:21:04,313 Error initializing Reporting object------ java.lang.RuntimeException: com.surecomp.reportwriter.bo.Reporting: unable to populate fields. at com.surecomp.reportwriter.bo.BO.newInstance(BO.java:211) at com.surecomp.reportwriter.ws.ReportingService.initialize(ReportingService.java:11) at com.surecomp.reportwriter.ReportWriter.init(ReportWriter.java:286) at javax.servlet.GenericServlet.init(GenericServlet.java:160) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1133) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1087) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4741) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5062) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5057) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.ClassCastException: oracle.jdbc.driver.OracleResultSetMetaData cannot be cast to oracle.jdbc.OracleResultSetMetaData at com.surecomp.reportwriter.ClientDatabase.getFieldTypes(ClientDatabase.java:1011) at com.surecomp.reportwriter.bo.Reporting.populateFields(Reporting.java:107) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.surecomp.reportwriter.bo.BO.newInstance(BO.java:205) ... 14 more ------ The code in question (by error) is the following public HashMap<String, Class> getFieldTypes(String tableName, String databaseName) throws Throwable { if (databaseName == null) { databaseName = Configuration.getDatabaseName(); } HashMap<String, Class> types = new HashMap<String, Class>(); Connection cn = null; ResultSet rs = null; DatabaseMetaData meta = null; try { cn = getConnection(databaseName, Configuration.getUsername(), Configuration.getPassword()); if ("oracle".equals(dbtype)) { Statement stmt = cn.createStatement(); rs = stmt.executeQuery("SELECT * from "+tableName); // Get the ResultSet meta data OracleResultSetMetaData rmd = (OracleResultSetMetaData)rs.getMetaData(); // this is the line of the error if (rmd == null) { throw new RuntimeException("ResultSet meta data is not available for the Oracle table ["+tableName+"]"); } else { int columnCount = rmd.getColumnCount(); for(int i=1; i<=columnCount; i++) { String name = rmd.getColumnName(i).toLowerCase(); int type = rmd.getColumnType(i); setType(types, name, type); } } } The only difference between the environments (from a code perspective) is how a database connection is obtained. The following shows that code (the difference is detected by a properties file container entry) Connection conn = null; DataSource ds = null; if (LanguageHelper.allMATCH) { conn = APIWrapper.getConnection(sDatabase); } else { conn = APIWrapper.getConnection(); } if (conn != null) return conn; Context ctx = new InitialContext(); ctx.addToEnvironment("SetBigStringTryClob", "true"); if (Configuration.getContainer().toLowerCase().equals("tomcat")) { Context envContext = (Context)ctx.lookup("java:/comp/env"); ds = (DataSource)envContext.lookup("jdbc/" + sDatabase); conn = ds.getConnection(); } else { ds = (DataSource)ctx.lookup("jdbc/" + sDatabase); conn = ds.getConnection(sUsername, sPassword); } Has anyone seen this type of issue before? Sincerely, Robert Jenkin Surecomp Services, Inc. 2 Hudson Place, 4th Floor Hoboken, NJ 07030 Skype: robert.jenkin Office: 201 217 1437 | Direct: 201 716 1219 | Mobile: 908 251 0537 http://www.Surecomp.com This mail was sent via Mail-SeCure System.