25

私たちが使用している 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 つの異なる Spring 構成ファイル (Spring 2.5 を使用) が必要になることを意味します。

これに対処するエレガントな方法はありますか。Tomcat で JNDI 名を直接検索できますか? 春は名前を付けて両方の場所を見ることができますか? Google の検索や提案はすばらしいでしょう。

4

8 に答える 8

19

Web アプリで単一の JNDI 名を使用する方法

私はこれに数ヶ月苦労しました。最善の解決策は、Tomcat と Weblogic の両方で同じ JNDI 名を持つように、アプリケーションを移植可能にすることです。

これを行うには、単一の jndi 名を指すようにweb.xmlandを変更し、各ベンダー固有の jndi 名へのマッピングを提供します。spring-beans.xml

以下に各ファイルを配置しました。

必要なもの:

  • <resource-ref />アプリが単一の名前を使用するための web.xmlのエントリ
  • WEB-INF/weblogic.xmljndi 名を WebLogic が管理するリソースにマップするためのファイル
  • META-INF/context.xmljndi 名を Tomcat によって管理されるリソースにマップするため のファイル
    • これは、Tomcat インストールまたはアプリ内のいずれかになります。

原則として、アプリ内の jndi 名は and のよう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 (Tomcat 用)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
于 2010-11-24T18:17:29.853 に答える
12

JndiLocatorSupportプロパティを持っていますresourceRef。これを true に設定すると、「java:comp/env/」プレフィックスが自動的に付加されます。したがって、Tomcat から Weblogic に移行する場合は、このパラメーターを区別するのが正しいと思います。

于 2009-01-14T19:37:29.273 に答える
2

次の設定は、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。[ターゲット]の下で、アプリを展開しているサーバーにデータソースをターゲットにしていることを確認してください。。この特定のポイントは、ちょうど今私に少し時間がかかりました...

于 2011-08-09T19:23:38.993 に答える
1

環境変数はどうですか?開発者のマシンを tomcat 名で、production を Weblogic 名で設定します。変数が存在しない場合に備えて、デフォルトのコード (WebLogic) を使用するようにコードを設定することもできます。

于 2008-09-07T05:18:20.813 に答える
1

アプリケーション自体に DataSource を設定することはそれほどクレイジーではありません:) アプリケーションがグリッドにデプロイされることを意図している場合、それは必須でさえあると言えます。River、GigaSpaces など。

注: 接続設定を WAR 内にハードコーディングする必要があるとは言いません。デプロイ時/実行時に指定する必要があります。これにより、構成する場所だけが存在するため、クラウド インスタンスの管理が簡素化されます。

コンテナーでのリソースの構成は、複数のアプリケーションがそこにデプロイされていて、それらが共有リソースを使用できる場合にのみ意味があります。

繰り返しますが、クラウド タイプの展開では、サーブレット コンテナー インスタンスごとに 1 つのアプリケーションしかありません。

于 2011-01-27T19:21:47.267 に答える
1

春のリソースをどのように参照していますか?

これは私たちが 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

于 2009-01-14T20:34:46.880 に答える
0

私のアプリケーションにも同様の問題があり、これが解決方法です。

1)WEB-INF/classes/application.properties次のエントリが含まれます。

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

2) WLS マシンでは、/etc/sysenvファイルに次のエントリがあります。

ds.jndi=wlsds

3)とを場所として${ds.jndi}使用するPropertyPlaceholderConfigurerBean を使用して、プロパティで JNDI をルックアップするようにスプリングを構成しました。また、開発者が自分のマシンにインストールする必要がないように を設定しました。classpath:application.propertiesfile:/etc/sysenvignoreResourceNotFoundtrue/etc/sysenv

4) Cargo+Jetty を使用して統合テストを実行しましたが、そこで JNDI 環境を適切にセットアップできませんでした。そのため、のプロパティをBasicDataSource使用してフォールバックも構成しています。defaultObjectJndiObjectFactoryBean

于 2008-09-08T20:07:44.427 に答える