문제

우리가 사용하고 있는 Weblogic 서버는 "appds"와 같은 JNDI 데이터 소스 이름을 허용하도록 구성되었습니다.

개발(localhost)을 위해 Tomcat을 실행할 수 있으며 server.xml의 <context> 섹션에 선언되면 Tomcat은 JNDI 트리의 "java:comp/env/jdbc/*"에 JNDI 데이터 소스를 정지합니다.

문제: Weblogic에서 JNDI 조회는 "appds"인 반면 Tomcat에서는 공식적인 "java:comp/env/jdbc/appds"를 제공해야 하는 것 같습니다.Tomcat 버전은 암묵적인 표준이지만 안타깝게도 Weblogic의 구성을 변경할 수는 없습니다.즉, 서로 다른 환경을 용이하게 하기 위해 두 개의 서로 다른 스프링 구성 파일(스프링 2.5 사용)이 생성된다는 의미입니다.

이 문제를 해결하는 우아한 방법이 있습니까?Tomcat에서 JNDI 이름을 직접 찾을 수 있나요?Spring은 이름을 갖고 두 곳을 모두 볼 수 있습니까?Google 검색이나 제안이 도움이 될 것입니다.

도움이 되었습니까?

해결책

JndiLocatorSupport 재산이 있다 resourceRef.이를 true로 설정하면 "java:comp/env/" 접두사가 자동으로 앞에 추가됩니다.따라서 Tomcat에서 Weblogic으로 이동할 때 이 매개변수를 차별화하는 것이 옳을 것이라고 생각합니다.

다른 팁

웹 앱에서 단일 JNDI 이름을 사용하는 방법

나는 몇 달 동안 이 문제로 어려움을 겪었습니다.가장 좋은 솔루션은 Tomcat과 Weblogic 모두에서 동일한 JNDI 이름을 갖도록 애플리케이션을 이식 가능하게 만드는 것입니다.

그러기 위해서는 당신의 web.xml 그리고 spring-beans.xml 단일 jndi 이름을 가리키고 각 공급업체의 특정 jndi 이름에 대한 매핑을 제공합니다.

아래에 각 파일을 올려두었습니다.

당신은 다음이 필요합니다

  • <resource-ref /> 앱이 단일 이름을 사용하기 위한 web.xml의 항목
  • 파일 WEB-INF/weblogic.xml WebLogic에서 관리하는 리소스에 jndi 이름을 매핑하려면
  • 파일 META-INF/context.xml jndi 이름을 Tomcat이 관리하는 리소스에 매핑하려면
    • 이는 Tomcat 설치 또는 앱에 있을 수 있습니다.

일반적으로 앱에서 jndi 이름을 다음과 같이 사용하는 것을 선호합니다. jdbc/MyDataSource 그리고 jms/ConnFactory 접두사를 사용하지 마세요. java:comp/env/.

또한 데이터 소스와 연결 팩토리는 컨테이너에서 가장 잘 관리되며 JNDI와 함께 사용됩니다.그것은 애플리케이션에서 데이터베이스 연결 풀을 인스턴스화하는 일반적인 실수.

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF/context.xml (톰캣의 경우)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>

나는 Spring을 사용하여 Tomcat과 WebLogic으로 트릭을 관리했습니다. 여기 그것은 나에게 어떻게 작동했는지에 대한 설명입니다.

다음 구성은 Tomcat과 Weblogic에서 작동합니다.

봄에:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>

Weblogic Admin Console에서 다음과 같은 JDBC 리소스를 생성합니다. jdbc/AgriShare.'대상'에서 앱을 배포할 서버를 데이터 소스로 지정했는지 확인하세요!.이 특별한 점 때문에 지금은 시간이 좀 걸렸습니다...

환경 변수는 어떻습니까?Tomcat 이름으로 개발자 컴퓨터를 설정하고 Weblogic 이름으로 프로덕션을 설정합니다.변수가 존재하지 않는 경우 기본 변수(WebLogic)를 사용하도록 코드를 설정할 수도 있습니다.

봄에 리소스를 어떻게 참조하고 있습니까?

Tomcat에 대한 내용은 다음과 같습니다.

문맥:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

봄:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

jee 네임스페이스는 다음에서 유래합니다.

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

애플리케이션 자체에서 DataSource를 설정하는 것은 그리 미친 일이 아닙니다 :) 애플리케이션이 그리드에 배포되도록 되어 있는 경우에도 이는 필수라고 말하고 싶습니다.River, GigaSpaces 또는 이와 유사한 것.

메모:연결 설정이 WAR 내부에 하드코딩되어야 한다고 말하는 것이 아니라 배포 시/런타임에 제공되어야 합니다.구성할 공간만 있으므로 클라우드 인스턴스 관리가 단순화됩니다.

컨테이너에서 리소스를 구성하는 것은 여러 애플리케이션이 컨테이너에 배포되고 공유 리소스를 사용할 수 있는 경우에만 의미가 있습니다.

다시 말하지만, 클라우드 유형의 배포에는 서블릿 컨테이너 인스턴스당 하나의 애플리케이션만 있습니다.

내 응용 프로그램에도 비슷한 문제가 있었는데 이것이 해결 방법입니다.

1) WEB-INF/classes/application.properties 다음 항목이 포함되어 있습니다.

ds.jndi=java:comp/env/jdbc/tcds

2) WLS 머신의 다음 항목에 항목이 있습니다. /etc/sysenv 파일:

ds.jndi=wlsds

3) 속성에 대해 JNDI를 조회하도록 스프링을 구성했습니다. ${ds.jndi}, 사용하여 PropertyPlaceholderConfigurerclasspath:application.properties 그리고 file:/etc/sysenv 위치로.나는 또한 ignoreResourceNotFound 에게 true 개발자가 그럴 필요가 없도록 /etc/sysenv 그들의 기계에.

4) Cargo+Jetty를 사용하여 통합 테스트를 실행했는데 JNDI 환경을 제대로 설정할 수 없었습니다.그래서 대체가 있어요 BasicDataSource 다음을 사용하여 너무 구성되었습니다. defaultObject 의 자산 JndiObjectFactoryBean.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top