18

context.xml に DataSource 構成があります。そのファイルにデータベース パラメータをハードコーディングしないことは可能ですか? たとえば、外部プロパティ ファイルを使用して、そこからパラメータをロードしますか?

このようなもの:

context.xml:

  <Resource
  name="jdbc/myDS" auth="Container"
  type="javax.sql.DataSource"
  driverClassName="oracle.jdbc.OracleDriver"
  url="${db.url}"
  username="${db.user}"
  password="${db.pwd}"
  maxActive="2"
  maxIdle="2"
  maxWait="-1"/>

デシベルのプロパティ:

db.url=jdbc:oracle:thin:@server:1521:sid
db.user=test
db.pwd=test
4

4 に答える 4

13

ここで述べたように、次の方法でこれを行うことができます。

1. tomcat ライブラリをダウンロードしてインターフェイス定義を取得します。たとえば、maven 依存関係を定義します。

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-coyote</artifactId>
        <version>7.0.47</version>
    </dependency>

2.次のステップは、次の方法で com.mycompany.MyPropertyDecoder を作成することです。

import org.apache.tomcat.util.IntrospectionUtils;
public class MyPropertyDecoder implements IntrospectionUtils.PropertySource  {
    @Override
    public String getProperty(String arg0) {
        //TODO read properties here
        return null;
    }
}

3. MyPropertyDecoder.class をtomcat7/libフォルダーに配置します
。 4. org.apache.tomcat.util.digester を定義します。次のようにtomcat7/conf/catalina.propertiesの PROPERTY_SOURCE プロパティ:

org.apache.tomcat.util.digester.PROPERTY_SOURCE=com.mycompany.MyPropertyDecoder

5.context.xml をプロパティ vars で更新します。

<Resource name="jdbc/TestDB"
           auth="Container"
           type="javax.sql.DataSource"
           username="root"
           password="${db.password}"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/mysql?autoReconnect=true"
           ...  

6.application.propertiesファイルをプロジェクト/コンテナーのどこかに配置します7.MyPropertyDecoderapplication.propertiesを正しく読み取るようにします 8.お楽しみください!

PSまた、 tc Serverについて説明されている同様のアプローチがあります。

于 2013-11-14T08:45:58.433 に答える
2

もちろん、これは可能です。次のよう にServletContextListenerを登録する必要があります。web.xml

<!-- at the beginning of web.xml -->

<listener>
    <listener-class>com.mycompany.servlets.ApplicationListener</listener-class>
</listener>

のソースcom.mycompany.servlets.ApplicationListener:

package com.mycompany.servlets;

public class ApplicationListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        // this method is invoked once when web-application is deployed (started)

        // reading properties file
        FileInputStream fis = null;
        Properties properties = new Properties();
        try {
            fis = new FileInputStream("path/to/db.properties")    
            properties.load(fis);
        } catch(IOException ex) {
            throw new RuntimeException(ex);
        } finally {
            try {
                if(fis != null) {
                    fis.close();
                }
            } catch(IOException e) {
                throw new RuntimeException(e);
            }
        }

        // creating data source instance
        SomeDataSourceImpl dataSource = new SomeDataSourceImpl();
        dataSource.setJdbcUrl(properties.getProperty("db.url"));
        dataSource.setUser(properties.getProperty("db.user"));
        dataSource.setPassword(properties.getProperty("db.pwd"));

        // storing reference to dataSource in ServletContext attributes map
        // there is only one instance of ServletContext per web-application, which can be accessed from almost anywhere in web application(servlets, filters, listeners etc)
        final ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("some-data-source-alias", dataSource);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        // this method is invoked once when web-application is undeployed (stopped) - here one can (should) implement resource cleanup etc
    }

}

そして、アクセスする Web アプリケーション コードのどこかdataSource:

ServletContext servletContext = ...; // as mentioned above, it should be accessible from almost anywhere
DataSource dataSource = (DataSource) servletContext.getAttribute("some-data-source-alias");
// use dataSource

SomeDataSourceImpljavax.sql.DataSourceの具体的な実装です。特定DataSourceの s (接続プーリング用のComboPooledDataSourceなど) を使用しておらず、取得方法がわからない場合はお知らせください。これをバイパスする方法を投稿します。

some-data-source-alias- は、属性マップ内のインスタンスの単なるStringエイリアス (キー) です。のようなパッケージ名を前に付けたエイリアスを与えることをお勧めします。DataSourceServletContextcom.mycompany.mywebapp.dataSource

お役に立てれば...

于 2012-07-13T11:13:37.837 に答える
0

これが Tomcat 7 であれば、独自のorg.apache.tomcat.util.IntrospectionUtils.PropertySource実装で "${...}" のように記述された変数を読み取ることができますcontext.xmlorg.apache.tomcat.util.digester.PROPERTY_SOURCE実装を指すようにシステム プロパティを設定する必要がありますPropertySource

于 2012-07-16T01:12:49.997 に答える