【问题标题】:Application using Pooled JDBC Connections使用池化 JDBC 连接的应用程序
【发布时间】:2009-04-21 18:44:20
【问题描述】:

我正在使用一个旧版 WebLogic 应用程序,该应用程序包含一个 Web 服务应用程序和一个独立的命令行应用程序。两者都需要访问公共数据库,我想尝试让命令行应用程序使用与 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 得到了这个想法。

关于我忽略了什么的任何想法?

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

【问题讨论】:

  • 如果您能告诉我们异常是什么,将会有所帮助。
  • java.lang.Object 也不例外。
  • 或许可以试试:Object dsObj = ctx.lookup("dbOracle"); System.out.println("Obj 是:" + dsObj.getClass().getName());看看你是否真的得到了你的想法?
  • 我认为完整的堆栈跟踪会很有用
  • 你能告诉我们你的独立应用程序中包含了哪些额外的库吗?

标签: java jdbc weblogic jndi


【解决方案1】:

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

【讨论】:

  • 没有在应用程序的类路径中包含 WebLogic 客户端 jar 文件。谢谢!
  • 是的,仅查看您需要的代码的导入语句并不明显。编译器不会抱怨,但是转换查找的对象会出错。
【解决方案2】:

可能是类路径问题,甚至是 jvm 版本问题?

【讨论】:

    【解决方案3】:

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

    祝你好运!

    【讨论】:

      【解决方案4】:

      我觉得这个问题可以通过执行bea或者weblogic\user_projects\domains\base_domain\bin>setDomainEnv.cmd解决

      【讨论】:

        【解决方案5】:

        很难用如此有限的信息来判断发生了什么。

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

        【讨论】:

        • 我刚刚添加了其他信息。我希望它会有所帮助。
        【解决方案6】:

        一种可能性:您导入了不正确的“DataSource”类:-)

        尝试替换这行代码:

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

        为此:

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

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

        【讨论】:

          【解决方案7】:

          我遇到了类似的问题,但在创建 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();
              }
          

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

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

          【讨论】:

            猜你喜欢
            • 2012-03-21
            • 1970-01-01
            • 2012-10-19
            • 2013-10-12
            • 2010-11-30
            • 2011-03-06
            • 1970-01-01
            • 1970-01-01
            • 2011-01-11
            相关资源
            最近更新 更多