2009-08-04 69 views
1

我使用JNDI上下文創建在這樣Tomcat的context.xml文件JDBC驅動程序的數據源,而不池創建數據源,如何在Tomcat中

<Resource name="db/test" 
      type="javax.sql.DataSource" 
      driverClassName="com.test.jdbc.Driver" 
      url="jdbc:fastdb://localhost:3306/session_db?autoReconnect=true&amp;connectTimeout=5000&amp;socketTimeout=5000" 
      zeroDateTimeBehavior="convertToNull" 
      username="dbuser" 
      password="password" 
      maxActive="100" 
      maxWait="2" 
      removeAbandoned="true" 
      removeAbandonedTimeout="60" 
      logAbandoned="true" /> 

默認情況下,Tomcat將使用DBCP數據源廠和創建彙集數據源。我們使用的特定數據庫和驅動程序已經支持較低級別的池化,額外的池化實際上會損害性能。無論如何,使用這樣的JNDI資源創建基本數據源(沒有池),所以我可以在最小配置更改的情況下在不同的數據庫之間切換?

我知道我可以寫我自己的數據源工廠或使用其他驅動程序的工廠來實現這一目標,但我正在尋找一個更簡單的解決方案。

+0

什麼JDBC驅動程序是您使用? – laz 2009-08-04 21:55:49

回答

2

不太清楚,如果這是什麼,將滿足你,但你可以隨時使用Spring JDBC support不使用被Tomcat管理數據源。

+0

我們剛剛刪除了Spring。我們確實看到了一些性能增益,不想回到它。 – 2009-08-05 13:33:08

+2

哇......我們時代的錯誤決定...... – skaffman 2009-08-06 16:49:40

0

您正在使用的JDBC驅動程序是否提供了javax.naming.spi.ObjectFactory的實現或其他可以使用org.apache.naming.factory.BeanFactory配置的其他連接對象?這些解決方案都不需要您編寫自定義代碼或添加任何其他第三方庫。

+0

不。在JDBC驅動程序中沒有提供那樣的東西。 – 2009-08-05 21:44:47

0

如果你真的想只是一個連接,嘗試在你的DBCP configuration的intialSize爲1和maxActive爲1。

從長遠來看,如果你不想使用連接池,那麼就不要使用JNDI來配置數據源,只需直接在你的web應用程序的代碼創建它。

編輯:

在您的評論對你說:「它只允許一個連接和服務器掛起的時候了,因爲每一個請求正在等待連接。」

是的,如果您通過將池大小設置爲1來關閉池,那將會發生什麼情況。但你的問題的標題是「如何創建沒有池的數據源」,所以我很困惑你到底想要完成什麼。

我的建議是不要使用JNDI來定義你的連接(定義JNDI數據源的整個目的是爲了在Web應用程序連接池)。相反,在您的兩種情況下,在您的servlet代碼中定義連接,一種情況會繼續使用DBCP,另一種情況會使用您的其他低級連接池。

0

我是做這樣一個Oracle非池連接:

<Resource 
     name="jdbc/aqds" 
     auth="Container" 
     type="oracle.jdbc.pool.OracleDataSource" 
     factory="oracle.jdbc.pool.OracleDataSourceFactory" 
     url="jdbc:oracle:thin:@localhost:1521:XE" 
     user="MYUSER" 
     password="MYPASSWORD" />