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

标签 java jdbc weblogic jndi

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

我一直在尝试使用 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"

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

"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)

最佳答案

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

关于java - 使用池化 JDBC 连接的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774018/

相关文章:

java - 如何获取本地日期时间而不是服务器日期时间

weblogic - 如何配置 WebLogic 10.3 Web App 以使用 SAML 2 SSO 和身份提供程序?

java - Android布局中的NPE

database - jdbc表设计哪个好

java - 类型实例化和声明在同一行

java - 用于 Crystal Reports 的 Oracle JDBC 瘦驱动程序放在哪里?

oracle - 在 JDBC 连接中使用 TNS 名称和服务名称的区别

java - 当我的连接被管理禁用时提交的事务

java - Ant 可以根据继承层次结构对 JUnit 测试进行分类吗?

java - 如何将 ActionListener 添加到模态 JDialog?