1. 程式人生 > >Spring配置DataSource資料來源

Spring配置DataSource資料來源

在Spring框架中有如下3種獲得DataSource物件的方法:
1.從JNDI獲得DataSource.
2.從第三方的連線池獲得DataSource.
3.使用DriverManagerDataSource獲得DataSource.

一、從JNDI獲得DataSource
SpringJNDI資料來源配置資訊:
  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
 <property name="jndiName">
  <value>java:comp/env/jcptDataSourceJNDI</value>
 </property>
  </bean>
  jcptDataSourceJNDI是tomcat或者其他應用伺服器配置的JNDI.

2、關於JNDI的配置(tomcat):
  修改tomcat目錄conf/context.xml檔案或server.xml檔案:
  <Resource name="jcptDataSourceJNDI" auth="Container"
 type="javax.sql.DataSource"
 maxActive="100"
 maxIdle="30"
 maxWait="10"  
 username="tysp"
 password="12345678"
 driverClassName="oracle.jdbc.driver.OracleDriver"
 url="jdbc:oracle:thin:@192.168.1.35:1521:orcl"
  />
  在server.xml中加入<Resource>元素:<Resource>元素用來定義JNDI Resource。
  屬性:描述
  name:指定Resource的JNDI名字
  auth:指定管理Resource的Manager,它有兩個可選值:Container、Application
  type:指定Resource所屬的Java類名
  <Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來指定各種引數值(也可以像上面那樣配置)
  屬性:描述
  factory       指定生成的DataResource的factory類名
  maxActive     指定資料庫連線池中處於活動狀態的最大連線數目,0表示不受限制
  maxIdle       指定資料庫連線池中處於空閒狀態的最大連線數目,0表示不受限制
  maxWait       指定連線池中連線處於空閒狀態的最長時間,超過會丟擲異常,-1表示無限
  username      指定連線資料庫的使用者名稱
  password      指定連線資料庫的口令
  driverClassName    指定連線資料庫的JDBC驅動程式
  url             指定連線資料庫的URL
 
3、通過JNDI獲取DataSource:
  Context context = new InitialContext();
  DataSource ds = (DataSource)context.lookup("java:comp/env/jcptDataSourceJNDI");

4.在web.xml中加入(spring配置中可以不用)
 <resource-ref> 
  <description>DB Connection</description> 
  <res-ref-name>jdbc/TestDB</res-ref-name> 
  <res-type>javax.sql.DataSource</res-type> 
  <res-auth>Container</res-auth> 
 </resource-ref> 
  在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web應用中引用JNDI資源  
  屬性:描述
  description     對所引用的資源的說明
  res-ref-name    指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對應
  res-type        指定所引用資源的類名字,與<Resource>元素中的type屬性對應
  res-auth        指定所引用資源的Manager,與<Resource>元素中的auth屬性對應

二、從第三方的連線池獲得DataSource
    Spring在第三方依賴包中包含了兩個資料來源的實現類包,其一是Apache的DBCP,其二是 C3P0
  1) DBCP類包位於 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴 Jakarta commons-pool物件池機制的資料庫連線池,
   所以在類路徑下還必須包括/lib/jakarta- commons/commons-pool.jar。
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
        <property name="url" value="jdbc:oracle:thin:@192.168.1.35:1521:orcl"></property>
        <property name="username" value="or_meal"></property>
        <property name="password" value="or_meal"></property>
        <property name="maxActive" value="100"></property>
        <property name="maxIdle" value="30"></property>
        <property name="maxWait" value="10"></property>
        <property name="defaultAutoCommit" value="false"></property>
    </bean>
 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect
                </prop>
                <prop key="show_sql">true</prop>
                <prop key="format_sql">true</prop>
            </props>
        </property>
        <property name="mappingResources">
        <list></list>
        </property>
    </bean>
    BasicDataSource提供了close()方法關閉資料來源,所以必須設定destroy-method=”close”屬性,
    以便Spring容器關閉時,資料來源能夠正常關閉。除以上必須的資料來源屬性外,還有一些常用的屬性:
    defaultAutoCommit:設定從資料來源中返回的連線是否採用自動提交機制,預設值為 true;
    defaultReadOnly:設定資料來源是否僅能執行只讀操作, 預設值為 false;
    maxActive:最大連線資料庫連線數,設定為0時,表示沒有限制;
    maxIdle:最大等待連線中的數量,設定為0時,表示沒有限制;
    maxWait:最大等待秒數,單位為毫秒, 超過時間會報出錯誤資訊;
    validationQuery:用於驗證連線是否成功的查詢SQL語句,SQL語句必須至少要返回一行資料;
    removeAbandoned:是否自我中斷,預設是 false ;
    removeAbandonedTimeout:幾秒後資料連線會自動斷開,在removeAbandoned為true,提供該值;
    logAbandoned:是否記錄中斷事件, 預設為 false;
   
    2)C3P0是一個開放原始碼的JDBC資料來源實現專案,C3P0類包位於Spring中lib/c3p0/c3p0-0.9.1.2.jar。
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method=”close”>
        <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>

三、使用DriverManagerDataSource獲得DataSource
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@192.168.1.35:orcl</value>
        </property>
        <property name="username">
            <value>or_meal</value>
        </property>
        <property name="password">
            <value>or_meal</value>
        </property>
    </bean>

    <bean id="dataBean" class="onlyfun.caterpillar.DataBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
    </bean> 
    DriverManagerDataSource建立連線是隻要有連線就新建一個connection,根本沒有連線池的作用