2009-04-21 10 views
0

웹 서비스 응용 프로그램과 독립 실행 형, 명령 줄 응용 프로그램이 포함 된 레거시 WebLogic 응용 프로그램을 사용하고 있습니다. 둘 다 공통 데이터베이스에 대한 액세스가 필요하며 명령 줄 응용 프로그램이 웹 서버의 JDBC 연결에 풀링 된 연결을 사용하도록하려고합니다. 내가 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 이름이 올바른지 확인했습니다. 다른 웹 응용 프로그램과 함께 데이터베이스에 연결할 수 있지만 독립 실행 형 응용 프로그램에는 계속 어려움이 있습니다. - 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" 

(설명 원래 질문)을 웹 응용 프로그램에 저장하고 데이터 소스에 연결할 수있었습니다 (즉, "작동"하는 것처럼 보입니다). 이 작업 테스트 보고서 :

"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

예외가 무엇인지 알려 주시면 도움이됩니다. –

+0

java.lang.Object도 예외는 아닙니다. – jsight

+2

아마도 시도하십시오 : 개체 dsObj = ctx.lookup ("dbOracle"); System.out.println ("Obj :"+ dsObj.getClass(). getName()); 당신이 정말로 당신이 생각하는 것을 얻고 있는지보기 위해서? – jsight

답변

1

이 예외는 서버 측에서 생성 된 것처럼 보입니다. 우선 WebLogic Server의 버전을 확인하고 클라이언트 응용 프로그램의 클래스 경로를 확인합니다. 클라이언트 응용 프로그램이 WebLogic Server와 동일한 버전의 WebLogic 클라이언트 jar 파일을 가지고 있는지 확인해야합니다. 클라이언트 클래스 패스에 weblogic 클라이언트 jar 파일을 포함시키는 것입니까? WebLogic의 RMI 드라이버를 사용하고 있으므로 클라이언트의 클래스 경로에 Oracle jar 파일이 필요하다고 생각하지 않습니다. 귀하의 클라이언트는 본질적으로 WebLogic Server에 대한 RMI를 사용하고 있습니다. 구성된 WebLogic Server 연결 풀은 Oracle과 대화하는 방법을 알고 있습니다. 연결 풀에서 사용하는 JDBC 드라이버는 중요하지 않습니다.

+0

응용 프로그램의 클래스 경로에 WebLogic 클라이언트 jar 파일을 포함하지 않았습니다. 감사! – Nate

+0

그래, 필요로하는 코드의 import 문만 보시면 분명하지 않습니다. 컴파일러는 불평하지 않지만 객체를 캐스팅하면 barf가 표시됩니다. – Gary

1

하드.

응용 프로그램을 씬 클라이언트로 설정 했습니까? Java EE 컨테이너 중 하나에서 작업하지 않을 경우, 조회 작업의 컨텍스트와 방법이 동일한 방식으로 작동하지 않습니다 (공급 업체별로 다름). 이러한 클라이언트에서 Weblogic을 사용하여 리소스 조회를 수행하는 방법과 올바르게 설정하는 방법을 연구 할 수 있습니다.

+0

동의합니다 ... 분명히 더 많은 데이터가 필요합니다. – jsight

+0

방금 ​​추가 정보를 추가했습니다. 도움이되기를 바랍니다. – Nate

1

아마도 클래스 경로 문제이거나 jvm 버전일까요? 이것에 대한

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

:

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

그냥 아이디어, 희망

0

하나의 가능성은 :

이 코드 줄을 교체하십시오 :-) 당신은 잘못 "데이터 소스"클래스를 가져 이 도움이 될 것입니다

1

오라클 드라이버에 대한 JAR 파일은 클라이언트 JVM은 서버의 클라이언트 JVM과 다릅니다. 동일한 Oracle JDBC 드라이버 jar가 명령 행 도구의 클래스 경로와 weblogic webapp에 모두 있는지 확인하십시오.

행운을 빕니다!

1

나는이 문제가 BEA 또는 웹 로직 \ user_projects \ 도메인 \ BASE_DOMAIN \ bin으로 실행하여 해결 될 생각> setDomainEnv.cmd

+0

그 아무것도하지만, jar 파일에 CLASSPATH를 설정 .... – sathish

0
나는 비슷한 문제가 있지만 wlfullclient.jar를 생성하고 클래스 경로에 보관 후 고정

.

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

서버 : 웹 로직 10.3.6

DS JNDI :

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(); 
    } 

심지어 내가 독립형 스프링 응용 프로그램을 호출 할 수 있어요 JDBC/시간 ...

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