tomcat JNDI Resource 配置


最近公司的項目慢慢開始向Maven項目遷移, 部分配置文件公共組也幫我們做了些改動,其中在spring的applicationContext.xml中看到了數據連接bean存在兩個,一個是jndi 一個是datasource.對jndi的數據連接不上很熟悉, 所以就搜索了相關的資料,在此做一下筆記。

在spring的applicationContext.xml文件中

jndi的寫法如下:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>java:comp/env/jdbc/b2b</value>
        </property>
    </bean>

datasource的寫法如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.sybase.jdbc3.jdbc.SybDriver" />
        <property name="url" value="jdbc:sybase:Tds:192.168.102.12:5000/test" />
        <property name="username" value="developtest" />
        <property name="password" value="1234567890" />
        <property name="maxIdle" value="1" />
        <property name="maxActive" value="3" />
        <property name="maxWait" value="10000" />
        <property name="logAbandoned" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="120" />
</bean>

上面使用datasource的寫法,就直接配置好了數據源。而jndi的寫法除此之外還需要在web項目中的web.xml中添加一個節點來申明資源的引用,web.xml如下:

<web-app>
...
<resource-ref>
    <description>b2bjoy Datasource</description>
    <res-ref-name>jdbc/b2b</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
...
</web-app>
最后在tomcat的conf目錄下的context.xml增加一個reource節點來開放這些資源給WEB應用程序。
<Context>
  ...
  <Resource name="jdbc/b2b" auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.commons.dbcp.BasicDataSourceFactory"
            username="developtest" password="1234567890"
            driverClassName="net.sourceforge.jtds.jdbc.Driver"
            url="jdbc:jtds:sqlserver://testServer:1433/DB"
            maxActive="8" maxIdle="4"/>
  ...
</Context>
至此,將數據源切換成jndi模式,啟動web項目,就能正常連接到數據源了,那么jndi配置是怎么回事,下面就來講述一下.
Tomcat 5.5 JNDI Resource 配置

一、簡介

在Tomcat 5 中,每個WEB應用程序的初使化環境(InitialContext)可以配置於$CATALINA_HOME/conf/server.xml的<Context>節點中,也可以配置每個WEB應用程序環境(Context)於單獨的XML文件中,如將每個WEB應用的配置放於$CATALINA_HOME/conf/Catalina/localhost目錄下,名稱可以為任意。

Tomcat 5為整個服務維護一個獨立的全局資源命名空間,它們被配置於$CATALINA_HOME/conf/server.xml的<GlobalNameingResources>節點,你可以通過使用<ResourceLink>節點開放這些資源給WEB應用程序。

這些定義的資源,可以被定義於你當前的WEB應用的WEB應用布署描述(/WEB-INF/web.xml)文件中的以下節點使用:

  1. <env-entry> :環境實體(Environment entry),一個單值參數(a single-value parameter)可以用於配置應用程序如何操作。
  2. <resource-ref>:資源引用(Resource reference),典型的應用為JDBC DataSource、JavaMail Session,或者配置於Tomcat5中的自定義對象工廠。
  3. <resource-env-ref>:資源環境引用(Resource environment reference),增加於Servlet 2.4中的resource-ref校驗,這種可以簡化資源配置,不需要授權信息。

InitialContext在WEB應用程序初使化的時候就被配置了,並且可以被WEB應用程序訪問(只讀的方式),所有配置的實體及資源,都放於JNDI命名空間的"java:comp/env"區。因此一個典型的資源訪問,這里指對JDBC DataSource的訪問。

二、配置JNDI資源

每個可訪問的JNDI資源配置於<Context>節點的如下節點:

  • <Environment> - 為scalar environment實體配置名稱及值,這些實體通過JNDI InitialContext開發給WEB應用程序(與在WEB應用布署描述文件(/WEB-INF/web.xml)中增加<env-entry>節點配置相同)。
  • <Resource> - 配置應用於WEB應用程序的資源名稱及數據類型(與在WEB應用布署描述文件(/WEB-INF/web.xml)中增加<resource-ref>節點配置相同)。
  • <ResourceLink> - 為定義於全局JNDI環境中的資源增加鏈接,這些資源鏈訪問定義於<Server>節點下的<GlobalNamingResources>的資源。
  • <Transaction> - 為在java:comp/UserTransaction中有效的初使化UserTransaction對象實例增加資源工廠。

三、TOMCAT標准資源工廠

Tomcat 5 包括一系列的標准資源工廠,它們可以為你的WEB應用程序提供服務,並且配置靈活(配置於$CATALINA_HOME/conf/server.xml),不需要修改WEB應用程序及布署描述。

注意:在標准資源工廠中,只有"JDBC Data Source"及"User Transaction"工廠可以移植到其它非TOMCAT平台,其它的標准資源工廠,包括你編寫的自定義資源工廠,都只可以在TOMCAT下運行,不可以移植到其它的平台。

JDBC數據源

1、安裝JDBC驅動

將JDBC驅動放於目錄$CATALINA_HOME/common/lib

2、/WEB-INF/web.xml增加配置

 

<resource-ref>
  <description>JDBC數據源配置實例</description> 
  <res-ref-name>jdbc/TestDB</res-ref-name> 
  <res-type>javax.sql.DataSource </res-type> 
  <res-auth>Container</res-auth> 
</resource-ref>

 

 3、配置TOMCAT資源工廠

<Context ...> 
... 
<Resource name="jdbc/TestDB" auth="Container" 
type="javax.sql.DataSource" 
factory="org.apache.commons.dbcp.BasicDataSourceFactory" 
username="dbusername" password="dbpassword" 
driverClassName="net.sourceforge.jtds.jdbc.Driver" 
url="jdbc:jtds:sqlserver://testServer:1433/DB" 
maxActive="8" maxIdle="4"/> 
... 
</Context> 

 相關屬性說明:

  1. name:JDBC數據源的名稱。
  2. auth:
  3. type:當前配置資源的類別。
  4. factory:數據源工廠,默認為"org.apache.commons.dbcp.BasicDataSourceFactory"。
  5. driverClassName - 驅動的全路徑類名。
  6. maxActive - 當前數據源支持的最大並發數。
  7. maxIdle - 連接池中保留最大數目的閑置連接數。
  8. maxWait - 當連接池中無連接時的最大等待毫秒數,在等當前設置時間過后還無連接則拋出異常。
  9. username - 訪問數據庫的用戶名
  10. password - 訪問數據庫的密碼
  11. url - JDBC驅動的連接字符串
  12. validationQuery - 在返回應用之前,用於校驗當前連接是否有效的SQL語句,如果指定了,當前查詢語句至少要返回一條記錄。

4、實例JAVA程序

Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
DataSource ds = (DataSource) 
envCtx.lookup("jdbc/TestDB"); 
Connection conn = ds.getConnection(); 
... use this connection to access the database ... 
conn.close(); 

 JavaMail Session

Tomcat 5 包括一個標准的、用於創建javax.mail.Session session實例的資源工廠,該工廠將會自動連接配置於server.xml中的SMTP服務器。在這種情況下,具體的應用完全不用去管email服務的配置環境,只需要在需要的時候,做簡單的請求、獲取預配置的session。

1、安裝JAR包

點擊這里下載JavaMail的JAR包,JavaMail依賴於Java Activation Framework,因而也需要下載

2、在web.xml配置

<resource-ref>
<description>JavaMail配置</description>
<res-ref-name>mail/Session</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>

 3、配置$CATALINA_HOME/conf/server.xml

<Context ...>
...
<Resource name="mail/Session" auth="Container"
type="javax.mail.Session"
mail.smtp.host="localhost"/>
...
</Context>

 注:默認的郵件服務端口為25,如果不是,則需要修改mail.smtp.host屬性為指定的主機,如mail.smtp.host="localhost:26"。

4、JAVA示例程序

......
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Session session = (Session) envCtx.lookup("mail/Session");
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(request.getParameter("from"));
InternetAddress to[] = new InternetAddress[1];
to[0] = new InternetAddress(request.getParameter("to"));
message.setRecipients(Message.RecipientType.TO, to);
message.setSubject(request.getParameter("subject"));
message.setContent(request.getParameter("content"), "text/plain");
Transport.send(message);
......

 以上簡述轉自:http://blog.csdn.net/fenglibing/article/details/4528512


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM