【问题标题】:NoClassDefFoundError when using Tomcat 7 and trying to getConnection from OracleDataSource object使用 Tomcat 7 并尝试从 OracleDataSource 对象获取连接时出现 NoClassDefFoundError
【发布时间】:2016-08-09 18:26:52
【问题描述】:

我想要做的是使用 OracleTranslatingConnection 对象打开到 Oracle Database 12c 服务器的连接,这样我就可以利用我在本地 12c 数据库上设置的 SQL 转换框架。

我正在开发的应用程序使用 Java 7 和 Tomcat 7。

如果我在 Tomcat 之外执行下面的 sn-p,就会建立连接,simpleQuery 会被正确翻译,并且我会从数据库中得到正确的结果。

但是,如果我使用 Tomcat 执行相同的 sn-p(不包括与上下文相关的所有内容),一旦到达 conn = ods.getConnection() 行,我就会收到以下异常。

当我在 Tomcat 之外执行时,我的类路径中有 ojdbc7.jarasm-3.3.1.jar(OJDBC 需要 ClassWriter?)。使用 Tomcat 时,jar 位于 Tomcat 的 lib 文件夹中,它们必须可见,因为我能够实例化这些 Oracle 对象。

我从Oracle's API reference 开始,最后在 Google 上找到解决方案没有成功。到目前为止,我发现的无用解决方案涉及ClassNotFoundException,其中必要的 jar 不在正确的位置,或者重新配置 Tomcat 的服务器/Web XML 文件(我不应该需要这些文件,因为我自己创建了一个数据源,而不是查看它通过上下文),或以不使用OracleDataSource的方式连接到数据库。我需要那个特定的对象,这样我就可以设置翻译功能的属性(参见props.put(...) 行)。

有人能解释一下我在这里缺少什么吗?

例外

    java.lang.NoClassDefFoundError: oracle/jdbc/internal/OracleConnection (wrong name: oracle/jdbc/proxy/oracle$1jdbc$1babelfish$1BabelfishConnection$2oracle$1jdbc$1internal$1OracleConnection$$$Proxy)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at oracle.jdbc.proxy.ClassGenerator$2.findClass(ClassGenerator.java:326)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at oracle.jdbc.proxy.ClassGenerator$2.findClass(ClassGenerator.java:326)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at oracle.jdbc.proxy.ClassGenerator.generate(ClassGenerator.java:319)
        at oracle.jdbc.proxy.ProxyFactory.prepareProxy(ProxyFactory.java:517)
        at oracle.jdbc.proxy.ProxyFactory.createProxy(ProxyFactory.java:479)
        at oracle.jdbc.proxy.ProxyFactory.proxyForCache(ProxyFactory.java:272)
        at oracle.jdbc.proxy.ProxyFactory.proxyFor(ProxyFactory.java:105)
        at oracle.jdbc.proxy.ProxyFactory.proxyFor(ProxyFactory.java:91)
        at oracle.jdbc.driver.OracleDriver.babelfishConnect(OracleDriver.java:657)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:561)
        at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:317)
        at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:241)
        at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:184)
        at com.example.OracleTest.testOracle(OracleTest.java:60)

代码片段

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    import oracle.jdbc.OracleConnection;
    import oracle.jdbc.OracleTranslatingConnection;
    import oracle.jdbc.pool.OracleDataSource;

    public class OracleTest {

        private static String TRANSLATION_PROFILE_NAME = "SQLSERVER_PROFILE";

        private static void testOracle() throws SQLException {
            String jdbcUrl = "jdbc:oracle:thin:@//server:1521/servicename";
            String jdbcUserName = "user";
            String jdbcPassword = "pass";
            Properties props = new Properties();
            OracleDataSource ods = null;
            OracleTranslatingConnection trConn = null;
            Statement trStmt = null;
            Connection conn = null;
            ResultSet trRs = null;
            String simpleQuery = "SELECT TOP 1 column1 FROM test_table ORDER BY column1 DESC";

            ods = new OracleDataSource();
            ods.setURL(jdbcUrl);
            ods.setUser(jdbcUserName);
            ods.setPassword(jdbcPassword);

            props.put(OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATION_PROFILE, TRANSLATION_PROFILE_NAME);
            ods.setConnectionProperties(props);

            conn = ods.getConnection();

            trConn = (OracleTranslatingConnection) conn;
            trStmt = trConn.createStatement(true);
            trRs = trStmt.executeQuery(simpleQuery);

            while (trRs.next()) {
                System.out.println("column1: " + trRs.getString(1));
            }

            trRs.close();
            trStmt.close();
            conn.close();
        }
    }

【问题讨论】:

  • 可能与this有关
  • @SameerPuri 感谢您的建议,但我能够从ojdbc7.jar 实例化对象,所以它肯定在正确的位置并且正在加载,所以我不相信这个问题是相关的。
  • 嗯,那可能和Tomcat的安全设置有关

标签: java tomcat jdbc noclassdeffounderror oracle12c


【解决方案1】:

很遗憾,经过与 Oracle 开发人员支持的反复讨论,确定这是 12.1 之后的版本中要修复的错误,我无法使用查询翻译功能。

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2017-12-24
    • 2012-12-17
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多