使用池化JDBC连接的应用程序

时间:2009-04-21 18:44:20

标签: java jdbc weblogic jndi

我正在使用包含Web服务应用程序和独立命令行应用程序的旧WebLogic应用程序。两者都需要访问公共数据库,我想尝试让命令行应用程序使用与Web服务器的JDBC连接的池连接。 (独立应用程序只能在服务器处于活动状态时运行,并且两者都将在同一台物理计算机上运行。)

我一直在尝试使用JNDI查找JDBC驱动程序,如下所示:

try {
    Context ctx = null;
    Hashtable ht = new Hashtable();
    ht.put(Context.INITIAL_CONTEXT_FACTORY,
           "weblogic.jndi.WLInitialContextFactory");
    ht.put(Context.PROVIDER_URL, "t3://localhost:7001");

    ctx = new InitialContext(ht);
    DataSource ds = (DataSource) ctx.lookup ("dbOracle");
    Connection conn = null;
    conn = ds.getConnection();  // <-- Exception raised here
    // conn = ds.getConnection(username, password); // (Also fails)

    // ...

} catch (Exception e) {
    // Handle exception...
}

我已经确认JNDI名称是正确的。我可以使用其他Web应用程序连接到数据库,但我的独立应用程序仍然存在困难。 - 我从WebLogic app note获得了这个想法。

关于我忽略的任何想法?

编辑1.1:我看到“java.lang.ClassCastException:java.lang.Object”异常。

编辑2:当我执行以下操作时:

Object dsObj = ctx.lookup("dbOracle");
System.out.println("Obj was: " + dsObj.getClass().getName());

在独立应用程序中,它会报告:

"Obj was: weblogic.jdbc.common.internal._RemoteDataSource_Stub"

我试图在Web应用程序中测试相同的代码块(在原始问题中描述),并且能够连接到数据源(即它似乎“工作”)。该工作测试报告:

"Obj was: weblogic.jdbc.common.internal.RmiDataSource"

此外,这是一个堆栈跟踪,用于何时失败:

####<Apr 22, 2009 10:38:21 AM EDT> <Warning> <RMI> <mlbdev16> <cgServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1240411101452> <BEA-080003> <RuntimeException thrown by rmi server: weblogic.jdbc.common.internal.RmiDataSource.getConnection()
 java.lang.ClassCastException: java.lang.Object.
java.lang.ClassCastException: java.lang.Object
    at weblogic.iiop.IIOPOutputStream.writeAny(IIOPOutputStream.java:1584)
    at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2222)
    at weblogic.utils.io.ObjectStreamClass.writeFields(ObjectStreamClass.java:413)
    at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:235)
    at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:225)
    at weblogic.corba.utils.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:182)
    at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:1957)
    at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:1992)
    at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2253)
    at weblogic.jdbc.common.internal.RmiDataSource_WLSkel.invoke(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
    at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475)
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59)
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)

7 个答案:

答案 0 :(得分:1)

很难说这些有限的信息是怎么回事。

您是否将应用程序设置为瘦客户端?当您不在其中一个Java EE容器中运行时,执行查找的上下文和方法不会以相同的方式工作(因供应商而异)。您可能想要研究如何使用来自此类客户端的Weblogic查找资源,以及如何正确设置它。

答案 1 :(得分:1)

也许是类路径问题甚至是jvm版本的东西?

答案 2 :(得分:1)

您在客户端JVM中为Oracle驱动程序提供的JAR可能与服务器中的JAR不同。确保命令行工具和weblogic webapp的两个类路径中都有相同的Oracle JDBC驱动程序jar

祝你好运!

答案 3 :(得分:1)

此异常看起来像是在服务器端生成的。我要做的第一件事是验证WebLogic Server的版本并检查客户端应用程序的类路径。您需要确保您的客户端应用程序具有与WebLogic Server相同版本的WebLogic客户端jar文件。您将weblogic客户端jar文件包含在客户端的类路径中,对吧?由于您使用的是WebLogic的RMI驱动程序,因此我不认为您在客户端的类路径中需要任何Oracle jar文件。您的客户端实际上是在向WebLogic Server说RMI。您配置的WebLogic Server连接池知道如何与Oracle通信。您在连接池中使用的JDBC驱动程序无关紧要。

答案 4 :(得分:1)

我认为通过执行bea或weblogic \ user_projects \ domains \ base_domain \ bin&gt; setDomainEnv.cmd

解决了这个问题

答案 5 :(得分:0)

一种可能性:导入错误的“DataSource”类: - )

尝试替换这行代码:

DataSource ds = (DataSource) ctx.lookup ("dbOracle");

为此:

javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("dbOracle");

只是一个想法,希望这会对你有所帮助

答案 6 :(得分:0)

我遇到了类似的问题,但在创建wlfullclient.jar并将其保存在类路径中后修复了。

https://docs.oracle.com/cd/E12840_01/wls/docs103/client/jarbuilder.html#wp1078098

服务器:weblogic 10.3.6

DS JNDI:jdbc / hr

DataSource dataSource = null;
    Context ctx = null;
    Properties p = new Properties();

    p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    p.put(Context.PROVIDER_URL, "t3://localhost:7001");
    ctx = new InitialContext(p);
    if (ctx != null) {
        dataSource = (DataSource) ctx.lookup("jdbc/hr");
    }

    if (dataSource != null) {
        Connection connection = dataSource.getConnection();
        ResultSet rs = connection.createStatement().executeQuery(
                "Select sysdate from dual");
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
        connection.close();
    }

即使我能够从独立的弹簧应用程序中调用它......

<bean id="applicationServerEnviromentProperties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
            <prop key="java.naming.provider.url">t3://localhost:7001</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>jdbc/hr</value>
    </property>
    <property name="jndiEnvironment">
        <ref local="applicationServerEnviromentProperties" />
    </property>
</bean>