javascript
spring集成jndi_Spring应用程序与JNDI连接池的集成测试
spring集成jndi
我們都知道,無論何時連接到數據庫,都需要使用連接池。 所有使用JDBC 4類的現代驅動程序都支持它。 在本文中,我們將概述Spring應用程序中的連接池,以及如何在非JEE環境(例如測試)中處理相同的上下文。
在Spring,大多數連接數據庫的示例都是使用DriverManagerDataSource完成的。如果您沒有正確閱讀文檔,那么您將錯過非常重要的一點。
注意: 此類不是實際的連接池; 它實際上并不合并連接。 它只是對成熟的連接池的簡單替代,實現了相同的標準接口,但是在每個呼叫上都創建了新的Connections。
對于J2EE容器外部的測試或獨立環境很有用,可以作為相應ApplicationContext中的DataSource bean,也可以與簡單的JNDI環境結合使用。 假定使用池的Connection.close()調用將簡單地關閉Connection,因此任何可識別DataSource的持久性代碼都應起作用。
是的,默認情況下,spring應用程序不使用池連接。 有兩種方法可以實現連接池。 取決于誰在管理池。 如果您在JEE環境中運行,則最好使用容器。 在非JEE設置中,有一些庫可以幫助應用程序管理連接池。 讓我們在下面詳細討論它們。
1.服務器(容器)管理的連接池(使用JNDI)
當應用程序連接到數據庫服務器時,建立物理實際連接所花費的時間遠遠超過了腳本的執行。 連接池是數據庫供應商率先采用的一種技術,它允許多個客戶端共享一組緩存的連接對象,這些對象提供對數據庫資源的訪問。 JavaWorld文章對此進行了很好的概述。
在J2EE容器中,建議使用容器提供的JNDI數據源。 這樣的DataSource可以通過JndiObjectFactoryBean在Spring ApplicationContext中作為DataSource bean公開,以實現與此類之類的本地DataSource bean之間的無縫切換。
以下文章幫助我在JBoss AS中設置數據源。
下一步是使用服務器從應用程序創建的這些連接。 如文檔中所述,您可以為此使用JndiObjectFactoryBean 。 如下所示
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName" value="java:/my-ds"/> </bean>如果要使用springs“ SpringJUnit4ClassRunner”編寫任何測試,則將無法加載上下文,因為JNDI資源將不可用。
對于測試,您可以通過Spring的SimpleNamingContextBuilder設置模擬JNDI環境,或者將Bean定義切換到本地DataSource(因此更簡單)。
當我在尋找一個很好的解決方案(我不想為測試提供單獨的上下文)時,這個SO答案對我有所幫助。 它很好地利用了Javadoc中給出的各種技巧。 上述解決方案的問題是重復創建JNDI連接的代碼。 我已經使用自定義的運行器SpringWithJNDIRunner解決了它。 此類將JNDI功能添加到SpringJUnit4ClassRunner。 它從類路徑中的“ test-datasource.xml”文件中讀取數據源,并將其綁定到名稱為“ java:/ my-ds”的JNDI資源。 執行此代碼后,JNDI資源可用于彈簧容器使用。
import javax.naming.NamingException;import org.junit.runners.model.InitializationError; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.mock.jndi.SimpleNamingContextBuilder; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** This class adds the JNDI capabilities to the SpringJUnit4ClassRunner.* @author mkadicha* */ public class SpringWithJNDIRunner extends SpringJUnit4ClassRunner {public static boolean isJNDIactive;/*** JNDI is activated with this constructor.* * @param klass* @throws InitializationError* @throws NamingException* @throws IllegalStateException*/public SpringWithJNDIRunner(Class<?> klass) throws InitializationError,IllegalStateException, NamingException {super(klass);synchronized (SpringWithJNDIRunner.class) {if (!isJNDIactive) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("test-datasource.xml");SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();builder.bind("java:/my-ds",applicationContext.getBean("dataSource"));builder.activate();isJNDIactive = true;}}} }<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="" /><property name="url" value="" /><property name="username" value="" /><property name="password" value="" /></bean></beans>要使用此運行程序,您只需在測試中使用注釋@RunWith(SpringWithJNDIRunner.class) 。 此類擴展了SpringJUnit4ClassRunner,因為@RunWith批注中只能有一個類。 一個測試周期僅創建一次JNDI。 此類為問題提供了一種干凈的解決方案。
2.應用程序管理的連接池
如果您需要J2EE容器之外的“實際”連接池,請考慮使用Apache的Jakarta Commons DBCP或C3P0。 Commons DBCP的BasicDataSource和C3P0的ComboPooledDataSource是完整的連接池bean,支持與此類相同的基本屬性以及特定的設置(例如最小/最大池大小等)。
下面的用戶指南可以幫助您進行配置。
以下文章介紹了配置連接池的一般準則和最佳實踐。
翻譯自: https://www.javacodegeeks.com/2014/03/integration-testing-for-spring-applications-with-jndi-connection-pools.html
spring集成jndi
總結
以上是生活随笔為你收集整理的spring集成jndi_Spring应用程序与JNDI连接池的集成测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑装机配置推荐电脑 装机 推荐
- 下一篇: 在硒中按TagName定位元素