小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Spring DataSource

 凌氏 2014-05-14

轉(zhuǎn)載:http://my.oschina.net/xiaomaoandhong/blog/60938

何為DataSource

DataSource 接口是 JDBC 2.0 API 中的新增內(nèi)容,它提供了連接到數(shù)據(jù)源的另一種方法。
作為 DriverManager 工具的替代項,DataSource 對象是獲取連接的首選方法。
實現(xiàn) DataSource 接口的對象通常在基于JNDI API 的命名服務(wù)中注冊。

不管通過何種持久化技術(shù),都必須通過數(shù)據(jù)連接訪問數(shù)據(jù)庫,在傳統(tǒng)的應(yīng)用中數(shù)據(jù)連接可以通過DriverManager獲的,
在Spring中,數(shù)據(jù)連接一般是通過數(shù)據(jù)源獲得的。在以往的應(yīng)用中,數(shù)據(jù)源一般是 Web應(yīng)用服務(wù)器提供的。
在Spring中,你不但可以通過JNDI獲取應(yīng)用服務(wù)器的數(shù)據(jù)源,也可以直接在Spring容器中配置數(shù)據(jù)源,
此外,你還可以 通過代碼的方式創(chuàng)建一個數(shù)據(jù)源,以便進(jìn)行無依賴的單元測試。

DataSource API定義: 

package javax.sql;
  
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
  
public interface DataSource  extendsCommonDataSource,Wrapper {
  
  Connection getConnection()throws SQLException;
    
  Connection getConnection(String username, String password) 
    throwsSQLException;
}

在Spring中配置Datasource

1、JDBC

Spring本身也提供了一個簡單的數(shù)據(jù)源實現(xiàn)類DriverManagerDataSource ,
它位于org.springframework.jdbc.datasource包中。這個類實現(xiàn)了javax.sql.DataSource接口,
但它并沒有提供池化連接的機(jī)制,每次調(diào)用getConnection()獲取新連接時,只是簡單地創(chuàng)建一個新的連接。
因此,這個數(shù)據(jù)源類比較適合在單元測試 或簡單的獨立應(yīng)用中使用,因為它不需要額外的依賴類。

<!-- 配置Spring DriverManagerDatasource數(shù)據(jù)源從中獲取connection,引入數(shù)據(jù)庫驅(qū)動 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"value="${jdbc.driverClassName}"/>
        <property name="url"value="${jdbc.url}"/>
        <property name="username"value="${jdbc.username}"/>
        <property name="password"value="${jdbc.password}"/>
    </bean>


DriverManagerDataSource extends AbstractDriverBasedDataSource extends AbstractDataSource implements DataSource

DriverManagerDataSource.java 
package org.springframework.jdbc.datasource;
  
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
  
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
  
  
public class DriverManagerDataSource extendsAbstractDriverBasedDataSource {
  
    publicDriverManagerDataSource() {
    }
  
    publicDriverManagerDataSource(String url) {
        setUrl(url);
    }
  
    publicDriverManagerDataSource(String url, String username, String password) {
        setUrl(url);
        setUsername(username);
        setPassword(password);
    }
  
    publicDriverManagerDataSource(String url, Properties conProps) {
        setUrl(url);
        setConnectionProperties(conProps);
    }
  
    publicDriverManagerDataSource(String driverClassName, String url, String username, String password) {
        setDriverClassName(driverClassName);
        setUrl(url);
        setUsername(username);
        setPassword(password);
    }
  
    publicvoid setDriverClassName(String driverClassName) {
        Assert.hasText(driverClassName,"Property 'driverClassName' must not be empty");
        String driverClassNameToUse = driverClassName.trim();
        try{
            Class.forName(driverClassNameToUse,true, ClassUtils.getDefaultClassLoader());
        }
        catch(ClassNotFoundException ex) {
            IllegalStateException ise =
                    newIllegalStateException("Could not load JDBC driver class ["+ driverClassNameToUse + "]");
            ise.initCause(ex);
            throwise;
        }
        if(logger.isInfoEnabled()) {
            logger.info("Loaded JDBC driver: "+ driverClassNameToUse);
        }
    }
  
    protectedConnection getConnectionFromDriver(Properties props) throws SQLException {
        String url = getUrl();
        if(logger.isDebugEnabled()) {
            logger.debug("Creating new JDBC DriverManager Connection to ["+ url + "]");
        }
        returngetConnectionFromDriverManager(url, props);
    }
  
    protectedConnection getConnectionFromDriverManager(String url, Properties props)throws SQLException {
        returnDriverManager.getConnection(url, props);
    }
  
}

DriverManagerDataSource建立連接是只要有連接就新建一個connection,根本沒有連接池的作用。

Spring在第三方依賴包中包含了兩個數(shù)據(jù)源的實現(xiàn)類包,其一是Apache的DBCP,其二是 C3P0。

2、DBCP

DBCP類包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴 Jakarta commons-pool對象池機(jī)制的數(shù)據(jù)庫連接池,
所以在類路徑下還必須包括/lib/jakarta- commons/commons-pool.jar。

<!-- 配置Spring dbcp Datasource數(shù)據(jù)源從中獲取connection,引入commons-dbcp、commons-pool包,數(shù)據(jù)庫驅(qū)動 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"value="${jdbc.driverClassName}"/>
        <property name="url"value="${jdbc.url}"/>
        <property name="username"value="${jdbc.username}"/>
        <property name="password"value="${jdbc.password}"/>
    </bean>

BasicDataSource.java 

public class BasicDataSource implementsDataSource {
      
    static{
        // Attempt to prevent deadlocks - see DBCP - 272
        DriverManager.getDrivers();
    }
    .
    .
    .
}

BasicDataSource提供了close()方法關(guān)閉數(shù)據(jù)源,所以必須設(shè)定destroy-method=”close”屬性,
以便Spring容器關(guān)閉時,數(shù)據(jù)源能夠正常關(guān)閉。除以上必須的數(shù)據(jù)源屬性外,還有一些常用的屬性:
defaultAutoCommit:設(shè)置從數(shù)據(jù)源中返回的連接是否采用自動提交機(jī)制,默認(rèn)值為 true;
defaultReadOnly:設(shè)置數(shù)據(jù)源是否僅能執(zhí)行只讀操作, 默認(rèn)值為 false;
maxActive:最大連接數(shù)據(jù)庫連接數(shù),設(shè)置為0時,表示沒有限制;
maxIdle:最大等待連接中的數(shù)量,設(shè)置為0時,表示沒有限制;
maxWait:最大等待秒數(shù),單位為毫秒, 超過時間會報出錯誤信息;
validationQuery:用于驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數(shù)據(jù);
removeAbandoned:是否自我中斷,默認(rèn)是 false ;
removeAbandonedTimeout:幾秒后數(shù)據(jù)連接會自動斷開,在removeAbandoned為true,提供該值;
logAbandoned:是否記錄中斷事件, 默認(rèn)為 false;

3、C3P0

C3P0是一個開放源代碼的JDBC數(shù)據(jù)源實現(xiàn)項目,C3P0類包位于Spring中l(wèi)ib/c3p0/c3p0-0.9.1.2.jar。

<!-- 配置Spring ComboPooledDataSource數(shù)據(jù)源從中獲取connection,引入c3p0-0.9.1.2.jar,數(shù)據(jù)庫驅(qū)動 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass"value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl"value="${jdbc.url}"/>
        <property name="user"value="${jdbc.username}"/>
        <property name="password"value="${jdbc.password}"/>
    </bean>

通過查看ComboPooledDataSource的源碼我們發(fā)現(xiàn)此處的屬性設(shè)置和上面不同,分別為driverClass、jdbcUrl、user。

4、JNDI(Java Naming and Directory Interface)

如果應(yīng)用配置在高性能的應(yīng)用服務(wù)器(如WebLogic或Websphere等)上或Jboss、Tomcat等,我們可能更希望使用應(yīng)用服務(wù)器本身提供的數(shù)據(jù)源。
應(yīng)用服務(wù)器的數(shù)據(jù)源使用JNDI使用,Spring為此專門提供引用JNDI資源的org\springframework\jndi\JndiObjectFactoryBean類。

以tomcat6為例:
1、在tomcat目錄下conf\context.xml中的<Context>標(biāo)簽中加入 

<Resource name="jndi" 
        auth="Container" 
        type="javax.sql.DataSource" 
        password="mysql5" 
        username="root" 
        driverClassName="com.mysql.jdbc.Driver"url="jdbc: 
        maxActive="5" 
        maxIdle="2" 
        maxWait="3000"
/>

2、修改項目的web.xml文件加入 
<resource-ref>
    <res-ref-name>jndi</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3、在spring配置文件中配置Datasource 
<!-- 從Tomcat配置的JNDI服務(wù)獲取數(shù)據(jù)源-->
    <bean id="dataSource" 
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"value="java:comp/env/jndi"/>
    </bean>

我們也可以采用下面的方式,但是要加入以下命名空間
xmlns:jee="http://www./schema/jee"

xsi:schemaLocation="http://www./schema/jee
                                 http://www./schema/jee/spring-jee-2.5.xsd">

<!-- Spring 2.0為獲取J2EE資源提供了一個jee命名空間,通過jee命名空間,可以有效地簡化J2EE資源的引用。 -->
    <jee:jndi-lookup id="dataSource"jndi-name="java:comp/env/jndi"/>


相關(guān)鏈接:http://hi.baidu.com/282518588/item/f8562799787c0338326eeb4f

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多