2011-05-09 67 views
2

當前我們有一個應用程序通過在Tomcat context.xml文件中使用數據源來配置。因此,我們可以通過檢索JNDI名稱並獲得連接來成功獲得連接。我想知道如果我們可以通過使用Spring數據源來替換它,並且我們仍然需要context.xml文件中的信息嗎?如果我創建一個Spring數據源,我還需要在Tomcat context.xml中定義數據源嗎?

例「的context.xml」:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource 
     name="jdbc/myDataSource" 
     auth="Container" 
     type="javax.sql.DataSource" 
     username="john" 
     password="doe" 
     driverClassName="<removed>" 
     url="<removed>" 
     maxActive="30" 
     maxIdle="10" 
     maxWait="1000" 
     removeAbandonedTimeout="60" 
     removeAbandoned="true" 
     logAbandoned="true"/> 
</Context> 

因此,在我們的代碼中尋找這樣的JNDI上下文:

Context envCtx = (Context) initCtx.lookup(..); 
DataSource ds = (DataSource) envCtx.lookup(..); 
Connection connection = ds.getConnection(); 

我在想,如果我們能更好地定義一個Spring數據源,而不是使用這種方法以及我們如何做到這一點?

回答

6

我假設你dataSource現在配置與此類似:

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

如果你像這樣的東西替代它:在Tomcat中

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://${jdbc.hostname}/${jdbc.schema}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

DataSource配置不再需要

在第一種情況下,連接池由Tomcat使用自己的實現進行管理和公開。後者的配置(我強烈建議由於可移植性和減少對容器的依賴)不依賴於Tomcat。相反,Spring實例化自己的連接池(注意池實現來自外部庫,如DBCP或C3P0),並且絕對沒有對Tomcat JNDI引用的引用。

+0

因此,如果我們定義一個像這樣的bean,我們可以跳過context.xml文件?我現在添加了一些示例代碼。 – Marco 2011-05-09 19:48:54

+0

現在我看到了你的編輯。你可以使用'context.xml'文件,但是像我的第一個例子那樣利用Spring並且通過JNDI查找'dataSource' **或者**使用第二個例子並且完全跳過'context.xml'和JNDI。 – 2011-05-09 19:53:31

1

Tomasz Nurkiewicz可能已經回答了這個問題,但我想指出一些關於commons-dbcp和tomcat jdbc連接池的問題:後者與可移植和更通用的commons-dbcp相比有幾個優點,其中一個最重要的是:tomcat連接池可能要快得多,並且可以防止飢餓。在做出決定之前,可能需要閱讀更多信息:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

1

將您的數據源定義放入Spring配置文件通常意味着代碼需要在開發,測試和生產環境之間移動時重新編譯。將定義放在context.xml中意味着相同的二進制文件可以在任何環境下工作。

相關問題