2013-03-04 55 views
5

我構建了一個具有獨立「核心」層的應用程序,該應用程序也用於構建一個webapp(這是一個Maven多模塊項目,具有'core'模塊和'webapp'模塊,它具有依賴於'核心'模塊)。 它使用MySQL數據庫。我嘗試實現DataSource,這兩種情況都可以(在獨立環境中只有1個連接是足夠的)。在獨立應用程序和webapp上下文中使用哪個應用程序的DataSource(Java 7,Tomcat 7)?

在閱讀了很多關於DataSources的文檔後,我不得不說我有點失落。我得出的結論是,也許我應該使用Tomcat JDBC Connection Pool。我的問題是:

1)在獨立上下文中,我應該如何提供配置以使用DataSource,因爲知道此配置將由Tomcat在webapp上下文中提供(因此,獨立配置不應覆蓋Tomcat配置)?

  • 我應該這樣做in this other question在僅在獨立的情況下調用的方法?但是,我如何在webapp上下文中看到Tomcat已經提供了DataSource?

  • 或者我應該使用bean定義嗎?但是如何在webapp上下文中使用這個bean?

2)其他池數據源實現呢?

結論: 是的,我迷路了,我不知道什麼是「黃金標準」爲數據源使用。感謝您的幫助。

回答

2

您可以在覈心模塊中查找數據源。您需要爲webapp模塊創建JNDI Datasource in Tomcat,爲獨立模塊創建Standalone JNDI support

例如爲了得到從數據源的Connection在兩個方面是相同的:

Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB"); 
Connection conn = ds.getConnection(); 

但數據源的配置是diferent。在Tomcat中,您會在鏈接的示例中看到類似的內容。

<Context> 
<Resource name="jdbc/MySQLDB" ... /> 
</Context> 

在獨立資源的名稱必須是相同的,她喜歡在獨立的ctx.lookup電話:

Properties prop = new Properties(); 
prop.put("java:comp/env/jdbc/MySQLDB", ds1); 

獨立的模塊中的InitialContextFactory必須獨立核心模塊的創建。

關於com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource請參閱this。Tomcat使用Apache軟件基金會的DBCP庫,您也可以在自己的非Java EE代碼中使用:http://jakarta.apache.org/commons/dbcp/

對於JDBC連接池在Tomcat中看到this和Apache的DBCP池見this

+0

感謝您的回覆,然後提出幾個問題:我的'核心'層是一個可用於其他應用程序的庫。如果我不希望這些應用程序執行第二個鏈接中描述的任務,則應將InitialContext設置在**核心層的內部,對嗎?所以也許我應該更簡單地在覈心層執行查找,捕獲如果不在webapp上下文中拋出的異常,然後在那種情況下設置我自己的Connection?那有效嗎? – FBB 2013-03-05 00:39:40

+0

如果'核心'包含這樣的功能,可以由其他應用程序執行。您可以生成第三個組件(使用自定義'InitialContextFactory'),可以從獨立應用程序調用該組件。我認爲這個需求功能對於獨立應用程序可能是獨一無二的,所以你可以將它嵌入到這樣的應用程序中。另一方面,你可以實現一個連接工廠。 – 2013-03-05 01:49:57

+0

是的,只是使用DriverManager的簡單連接工廠,當無法使用JNDI加載DataSource時。驅動程序可以通過屬性文件進行配置。那有效嗎? Os是一種可怕的設計模式? :p – FBB 2013-03-05 12:42:19