下面詳細(xì)討論SQL Map 配置文件的各組成部分。
(一) <properties>元素
SQL Map 配置文件擁有唯一的<properties>元素,用于在配置文件中使用標(biāo)準(zhǔn)的Java屬性文件(name=value)。在屬性文件中定義的屬性可以作為變量在SQL Map 配置文件及其包含的所有SQL Map 映射文件中引用。
例如,如果屬性文件中包含屬性:driver=org.hsqldb.jdbcDriver
SQL Map 配置文件及其每個(gè)映射文件都可以使用占位符${driver} 來(lái)代表值org.hsqldb.jdbcDriver。
例如:<property name="JDBC.Driver" value="${driver}"/>
這個(gè)元素在開(kāi)發(fā),測(cè)試和部署各階段都很有用。它可以使在多個(gè)不同的環(huán)境中重新配置應(yīng)用和使用自動(dòng)生成工具(如ANT)變得容易。
Java屬性文件可以通過(guò)類路徑導(dǎo)入,也可以通過(guò)有效的URL導(dǎo)入。
(二) <setting>元素
<setting>元素用于配置和優(yōu)化利用XML配置文件創(chuàng)建的SqlMapClient實(shí)例。<settings>元素及其所有的屬性都是可選的。下面列出了<setting>元素支持的屬性和功能:
1. maxExecute
同時(shí)執(zhí)行一個(gè)Sql statement的最大線程數(shù),大于這個(gè)值的線程將阻塞直到另一個(gè)線程退出。不同的DBMS 有不同的限制值。
例子:maxExecute="256"
缺省值:512
一般情況下,這個(gè)值要大于10,而且要同時(shí)比maxSessions和maxTransactions參數(shù)設(shè)定的值大。通常情況下,減少最大同時(shí)訪問(wèn)次數(shù)可以提高執(zhí)行的效率。
2. maxSessions
是指在一個(gè)給定時(shí)間內(nèi)處于活動(dòng)狀態(tài)的session(或客戶端)的數(shù)量。這個(gè)值一般要大于或等于maxTransactions的參數(shù)值,同時(shí)要小于maxRequests的參數(shù)值
例子: maxSessions="64"
缺省值:128
3. maxTransaction
同時(shí)進(jìn)入SqlMapClient.startTransaction()的最大線程數(shù)。大于這個(gè)值的線程將阻塞直到另一個(gè)線程退出。不同的DBMS 有不同的限制值。這個(gè)值應(yīng)該總是小于或等于maxSessions,而且要比maxRequests小的多。通常情況下,減少這個(gè)值可以提高執(zhí)行的效率。
例子:maxTransaction="16"
缺省值:32
4. cacheModelsEnabled
啟用或禁用SqlMapClient所有的cache models。調(diào)試程序時(shí)有用。
例子:cacheModelsEnabled="true"
缺省值:true
5. lazyLoadingEnabled
啟用或禁用SqlMapClient所有的lazy loading。調(diào)試程序時(shí)有用。
例子:lazyLoadingEnabled="true"
缺省值:true
6. enhancementEnabled
This setting enables runtime bytecode enhancement to facilitate optimized JavaBean property access as well as enhanced lazy loading.
例子 enhancementEnabled="true"
缺省值: false (disabled)
7. useStatementNamespaces
這個(gè)選項(xiàng)如果啟用,你就必須使用全限定名來(lái)引用mapped statements,這個(gè)全名是由sqlMap的名字和statement的名字組成的。
例如:queryForObject("sqlMapName.statementName");
例子: useStatementNamespaces="false"
缺省值: false (disabled)
(三) <typeAlias>元素
<typeAlias>允許你指定別名。這樣你就可以通過(guò)你指定的短名字來(lái)代替冗長(zhǎng)的名字了。
例如:<typeAlias alias="shortname" type="com.long.class.path.Class"/>
下面是在SqlMap中預(yù)定義的別名:
1. Transaction Manager Aliases
JDBC com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig
JTA com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
EXTERNAL com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig
2. Data Source Factory Aliases
SIMPLE com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
DBCP com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
JNDI com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory
(四)<transactionManager>元素
注意:在Sql Map 1.0版本中,允許同時(shí)配置多個(gè)數(shù)據(jù)源,這樣會(huì)導(dǎo)致一些問(wèn)題。所以從2.0的版本開(kāi)始,只允許配置一個(gè)數(shù)據(jù)源,如果你有配置多個(gè)數(shù)據(jù)源的需求的話,建議你使用多個(gè)不同配置的屬性文件,或者在build Sql Map的時(shí)候,作為一個(gè)參數(shù)傳進(jìn)來(lái)。
<transactionManager>元素允許你為SQL Map配置事務(wù)管理服務(wù)。type屬性用來(lái)指明使用哪種事務(wù)管理,值既可以是一個(gè)類名字,也可以是一個(gè)別名。
在框架中已經(jīng)包含了三種事務(wù)管理:JDBC, JTA 和 EXTERNAL
1. JDBC
允許用JDBC通過(guò)Connection 的commit()和rollback()方法來(lái)控制事務(wù)。
2. JTA
這種事務(wù)管理使用一個(gè)JTA的全局事務(wù)將SQL Map的activities作為一個(gè)wider scope事務(wù)的一部分而包含進(jìn)來(lái),這個(gè)事務(wù)可能包含其他的數(shù)據(jù)庫(kù)或事務(wù)
源。這個(gè)配置需要一個(gè)UserTransaction屬性來(lái)通過(guò)JNDI resource設(shè)置本地的user transaction。
3. EXTERNAL
允許你自己管理事務(wù)。你仍然可以配置一個(gè)數(shù)據(jù)源,但是事務(wù)不會(huì)在框架生命周期中被提交或回滾。這意味著你必須要用自己的程序來(lái)控制事務(wù)。這個(gè)設(shè)置對(duì)于非事務(wù)型數(shù)據(jù)庫(kù)是非常有用的。
(五) <datasource>元素
<datasource>標(biāo)簽及其屬性是<transactionManager>的配置的一部分,它也是用于配置你的SQL Map所使用的數(shù)據(jù)源的。
目前本框架提供三種數(shù)據(jù)源工廠,但是你也可以自己寫(xiě)一個(gè)。下面是每一種數(shù)據(jù)源工廠的配置舉例:
1. SimpleDataSourceFactory
SimpleDataSourceFactory 為池化的DataSource提供了一個(gè)基本的實(shí)現(xiàn),適用于在沒(méi)有容器提供數(shù)據(jù)源的情況。
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>
2. DbcpDataSourceFactory
DbcpDataSourceFactory 實(shí)現(xiàn)使用Jakarta DBCP(Database Connection Pool)的DataSource
API 提供連接池服務(wù)。適用于Web 容器不提供DataSource 服務(wù)的情況,或執(zhí)行一個(gè)單獨(dú)的
應(yīng)用。DbcpDataSourceFactory 中必須要配置的參數(shù)例子如下:
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<!-- Use of the validation query can be problematic.
If you have difficulty, try without it. -->
<property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>
3. JndiDataSourceFactory
JndiDataSourceFactory 在應(yīng)用服務(wù)器的容器中從JNDI Context 中查找DataSource 實(shí)現(xiàn)。當(dāng)使用應(yīng)用
服務(wù)器,并且服務(wù)器提供了容器管理的連接池和相關(guān)的DataSource 實(shí)現(xiàn)的情況下,可以使用
JndiDataSourceFactory。使用JDBC DataSource 的標(biāo)準(zhǔn)方法是通過(guò)JNDI 來(lái)查找。
JndiDataSourceFactory必須要配置的屬性如下:
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
注意:上面的配置是使用標(biāo)準(zhǔn)的JDBC事務(wù)管理。但是,在一個(gè)容器管理的數(shù)據(jù)源中,你也可能想為全局的事務(wù)做如下配置:
<transactionManager type="JTA" >
<property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
注意:UserTransaction屬性指向一個(gè)JNDI的位置,你可以通過(guò)這個(gè)JNDI找到一個(gè)UserTransaction實(shí)例。這個(gè)在JTA的事務(wù)管理中是需要的,這樣可以使你的SQL MAP參與到包含有其他數(shù)據(jù)庫(kù)和事務(wù)源的事務(wù)中。
(六)<sql-map>元素
sqlMap元素用于包括SQL Map 映射文件和其他的SQL Map 配置文件。每個(gè)SqlMapClient
對(duì)象使用的SQL Map 映射文件都要在此聲明。映射文件作為stream resource 從類路徑或URL中讀
入。您必須相對(duì)于類路徑或URL來(lái)指定所有的SQL Map 文件。
下面是幾個(gè)例子:
<!-- CLASSPATH RESOURCES -->
<sqlMap resource="com/ibatis/examples/sql/Customer.xml" />
<sqlMap resource="com/ibatis/examples/sql/Account.xml" />
<sqlMap resource="com/ibatis/examples/sql/Product.xml" />