我正在使用包含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)
答案 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>