<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-86  評論-33  文章-0  trackbacks-0
    DataSource注入

    對于不同的數據庫存取需求,我們使用JDBC來解決這個問題,對于不同的數據連接來源需求,Spring則提供了DataSource注入,更換數據來源只要在Bean定義文件中修改配置,而不用修改任何一行程序。

    因應不同的系統,應用程序可能使用不同的數據來源,但如純綷的使用 JDBC、透過連接池、或是透過JNDI等等,數據來源的更動是底層的行為,不應影響到上層的業務邏輯,為此,您可以在需要取得連接來源的Bean上保留一個數據來源注入的接口,讓依賴的數據來源由該接口注入。例如我們來寫一個簡單的Bean:

    DataBean.java

    package  onlyfun.caterpillar; 
                                                                                 
    import  javax.sql.DataSource; 

    import  java.sql.Connection; 

    public   class  DataBean { 

        
    private  DataSource dataSource; 
                                                                                    
        
    public   void  setDataSource(DataSource dataSource) { 

            
    this .dataSource  =  dataSource; 

        } 
                                                                                 
        
    public   void  testDataSource() { 

            
    try  { 

                Connection connection 
    =  dataSource.getConnection(); 

                
    if (connection  !=   null

                    System.out.println(
    " test ok! " ); 

            } 

            
    catch  (Exception e) { 

                e.printStackTrace(); 

            } 

        } 

    }

    這是一個簡單的測試Spring DataSource注入的程序,我們透過javax.sql.DataSource接口來注入數據來源,Spring提供了 org.springframework.jdbc.datasource.DriverManagerDataSource來取得 DataSource,它實作了javax.sql.DataSource,您將之當作一個Bean,之后再注入DataBean中即可,Bean定義檔可以這么撰寫:

    <? xml version = " 1.0 "  encoding = " UTF-8 " ?>  

    <! DOCTYPE beans PUBLIC  " -//SPRING/DTD BEAN/EN "   " http://www.springframework.org/dtd/spring-beans.dtd " >  

    < beans >  

        
    < bean id = " dataSource "   class = " org.springframework.jdbc.datasource.DriverManagerDataSource " >  

            
    < property name = " driverClassName " >  

                
    < value > com.mysql.jdbc.Driver </ value >  

            
    </ property >  

            
    < property name = " url " >  

                
    < value > jdbc:mysql: // localhost:3306/TestDB</value> 

            
    </ property >  

            
    < property name = " username " >  

                
    < value > caterpillar </ value >  

            
    </ property >  

            
    < property name = " password " >  

                
    < value > 123456 </ value >  

            
    </ property >  

        
    </ bean >  

                                                                                    

        
    < bean id = " dataBean "   class = " onlyfun.caterpillar.DataBean " >  

            
    < property name = " dataSource " >  

                
    < ref bean = " dataSource " />  

            
    </ property >  

        
    </ bean >  

    </ beans >

    如果您之前只使用spring-core.jar這個類別庫,您還必須加入 spring-dao.jar, org.springframework.jdbc.datasource.DriverManagerDataSource是包括在這個類別庫中,如果您使用的是spring.jar,當中已經包括了,無需加入任何的jar,當然,為了使用JDBC,您必須要有JDBC驅動程序的jar檔。

    可以用下面這段程序簡單的測試一下:

    BeanDefinitionRegistry reg = new DefaultListableBeanFactory();

    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);

                                                                                    

    reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));;

                                                                                   

    BeanFactory bf = (BeanFactory) reg;

    DataBean dataBean = (DataBean) bf.getBean("dataBean");

    dataBean.testDataSource();


    DriverManagerDataSource并沒有提供連接池的功能,只能作作簡單的單機連接測試,現在假設連接測試沒有問題了,您想要換上DBCP以獲得連接池的功能,則原程序不用更動,只要改改Bean定義檔就可以了:

    <? xml version = " 1.0 "  encoding = " UTF-8 " ?>  

    <! DOCTYPE beans PUBLIC  " -//SPRING/DTD BEAN/EN "   " http://www.springframework.org/dtd/spring-beans.dtd " >  

    < beans >  

        
    < bean id = " dataSource "   class = " org.apache.commons.dbcp.BasicDataSource "  destroy - method = " close " >  

            
    < property name = " driverClassName " >  

                
    < value > com.mysql.jdbc.Driver </ value >  

            
    </ property >  

            
    < property name = " url " >  

                
    < value > jdbc:mysql: // localhost:3306/TestDB</value> 

            
    </ property >  

            
    < property name = " username " >  

                
    < value > caterpillar </ value >  

            
    </ property >  

            
    < property name = " password " >  

                
    < value > 123456 </ value >  

            
    </ property >  

        
    </ bean >  

        
    < bean id = " dataBean "   class = " onlyfun.caterpillar.DataBean " >  

            
    < property name = " dataSource " >  

                
    < ref bean = " dataSource " />  

            
    </ property >  

        
    </ bean >  

    </ beans >


    現在我們使用的是org.apache.commons.dbcp.BasicDataSource作為注入的 DataSource源,為了使用DBCP的功能,您必須要將commons-dbcp.jar加入CLASSPATH中,另外您還需要commons- pool.jar與commons-collections.jar,這些都可以在Spring的相依版本中的lib目錄下找到。

    注意到我們在dataSource Bean上宣告了destroy-method,如此可以確保BeanFactory在關閉時也一并關閉BasicDataSource。

    如果您要直接使用JDBC來進行數據存儲,使用org.springframework.jdbc.datasource.DataSourceUtils來取得Connection會是更好的方式:

    Connection conn = DataSourceUtils.getConnection(dataSource);


    這樣作的好處是,所有的SQLException都被Spring的DataAccessException子類CannotGetJdbcConnectionException包裝起來。您可以獲得更多的信息,并保證存儲層的可移值性。


    關閉Connection時,可以用下面的方式:

    DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);


    如果您的Servlet容器提供了JNDI資料源,您也可以簡單的換上這個數據源:

    <? xml version = " 1.0 "  encoding = " UTF-8 " ?>  

    <! DOCTYPE beans PUBLIC  " -//SPRING/DTD BEAN/EN "   " http://www.springframework.org/dtd/spring-beans.dtd " >  

    < beans >  

        
    < bean id = " dataSource "   class = " org.springframework.indi.JndiObjectFactoryBean " >  

            
    < property name = " jndiName " >  

                
    < value > jdbc / TestDB </ value >  

            
    </ property >  

        
    </ bean >  

        
    < bean id = " dataBean "   class = " onlyfun.caterpillar.DataBean " >  

            
    < property name = " dataSource " >  

                
    < ref bean = " dataSource " />  

            
    </ property >  

        
    </ bean >  

    </ beans >


    為了使用org.springframework.indi.JndiObjectFactoryBean,您必須加入 spring-context.jar這個類別庫,jndiName實際上要根據您所設定的JNDI查詢名稱

    posted on 2006-11-07 09:03 Derek.Guo 閱讀(5719) 評論(3)  編輯  收藏 所屬分類: Java

    評論:
    # re: Spring DataSource注入 2007-10-23 15:14 | leefu
    你好,我想問下,用JNDI的 DataSource,然后在java應用中用到DataBean,在DataBean中加上一個ExecuteQuery()方法,在頻繁的調用這個ExecuteQuery()方法的時候會出現連接池用完 ORA-04031: 無法分配 2816 字節的共享內存,想問一下,用JNDI的 DataSource的時候該怎么解決這個連接池的問題,謝謝  回復  更多評論
      
    # re: Spring DataSource注入[未登錄] 2007-11-05 22:00 | Derek
    @leefu
    你好!
    不管使用什么樣的數據源datasource;都需要處理關閉數據庫連接的問題?。∵B接池與非連接池不同的是在于,連接是被正真關閉還是被返回池中??!
    通過JNDI的Datasource去獲取的連接,同樣需要你去CLOSE;否則池中的連接同樣會被用完的;
    那么關閉連接要么你純手工完成,要么使用SPRING的TEMPLATE,讓它幫你完成!  回復  更多評論
      
    # re: Spring DataSource注入[未登錄] 2008-11-28 15:51 | 啊啊
    不錯,不像其他文章搞的很亂  回復  更多評論
      
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 亚洲国产精品综合久久20| 日韩亚洲国产综合高清| 无遮挡国产高潮视频免费观看| 久久精品亚洲日本波多野结衣| 精品一区二区三区免费视频| 国产乱子影视频上线免费观看| 亚洲中文字幕无码中文| 成年人免费视频观看| 亚洲色婷婷综合久久| 中文字幕成人免费高清在线视频 | 国产精品亚洲产品一区二区三区 | 亚洲色无码专区一区| 女人张开腿给人桶免费视频| 亚洲中文无码永久免| 日韩高清免费观看| 牛牛在线精品观看免费正 | 国产精品一区二区三区免费| 麻豆最新国产剧情AV原创免费 | 日本无卡码免费一区二区三区| 亚洲AV日韩AV无码污污网站| 最近免费中文字幕mv在线电影| 亚洲精品福利在线观看| a视频在线免费观看| 亚洲第一AAAAA片| 国产91色综合久久免费| 男人天堂2018亚洲男人天堂| 国产成人高清精品免费软件| 一级做a爰全过程免费视频毛片| 在线视频免费观看www动漫| 精品国产亚洲第一区二区三区| 亚洲婷婷国产精品电影人久久| 野花香高清在线观看视频播放免费 | a在线视频免费观看在线视频三区 a毛片成人免费全部播放 | 亚洲一区免费在线观看| 免费无码毛片一区二区APP| 亚洲另类古典武侠| 亚洲av无码不卡私人影院| 在线视频亚洲一区| 69式国产真人免费视频| 国产成人亚洲午夜电影| 亚洲av无码乱码国产精品|