SQL Map XML配置檔案。

孤芳不自賞發表於2017-08-31

SQL Map使用XML配置檔案統一配置不同的屬性,包括DataSource的詳細配置資訊,SQL Map和其他可選屬性,如執行緒管理等。以下是SQL Map配置檔案的一個例子:

SqlMapConfig.xml


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

<!DOCTYPE sqlMap Config PUBLIC "_//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<!-- Always ensure to use the correct XML headers as above!  -->

<sqlMapConfig>


<!-- The properties (name = value) in the file specified here can be used placeholders in this config file (e.g."${driver}". The file is relative to the classpath and is completely optional.) -->

<properties resource = "examples/sqlmap/maps/SqlMapConfigExample.properties" />


<!-- These settings control SqlMapClient configuration details, primarily to do with transaction management. They are all optional(more detail later in this document). -->

<settings

cacheModelsEnabled = "true"

enhancementEnabled = "true"

lazyLoadingEnabled = "true"

maxRequests = "32"

maxSessions = "10"

maxTransactions = "5"

useStatementNamespaces = "false"

/>

<!-- Type alias allow you to use a shorter name for long fully qualified class names. -->

<typeAlias alias = "order" type ="testdomain.Order" />


<!-- Configure a datasource to use with this SQL Map using SimpleDataSource. Notice the use of the properties from the above resource -->

<transactionManager type = "JDBC">

<dataSource type = "SIMPLE">

<property name = "JDBC.Driver" value ="${driver}" />

<property name = "JDBC.ConnectionURL" value = "${url}" />

<property name = "JDBC.Username" value ="${username}" />

<property name = "JDBC.Password" value = "${password}" />

<property name = "JDBC.DefaultAutoCommit" value = "true" />

<property name = "Pool.MaximumActiveConnections"  value ="10" />

<property name = "Pool.MaximumldleConnections" value = "5" />

<property name = "Pool.MaximumCheckoutTime" value = "120000" />

<property name = "Pool.TimeToWait" value = "500" />

<property name = "Pool.PingQuery" value = "select 1 from ACCOUNT" />

<property name = "Pool.PingEnabled" value = "false" />

<property name = "Pool.PingConnectionsOlderThan" value = "1" />

<property name = "Pool.PingConnectionsNotUsedFor" value = "1" />

</dataSource>

</transactionManager>


<!-- Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths are relative to the classpath. For now,we only have one... -->

<sqlMap resource = "examples/sqlmap/maps/Person.xml"/>

</sqlMapConfig>


以下詳細討論SQL Map配置檔案的各組成部分。

<properties>元素

SQL Map配置檔案擁有唯一的<properties>元素,用於在配置檔案中使用標準的Java屬性檔案(name = value)。這樣做後,在屬性檔案中定義的屬性可以作為變數在SQL Map配置檔案及其包含的所有SQL Map對映檔案中引用。例如,如果屬性檔案中包含屬性:

driver = org.hsqldb.jdbcDriver

SQL Map配置檔案及其每個對映檔案都可以使用佔位符${driver}來代表值org.hsqldb.jdbcDriver。例如:

<property name = "JDBC.Driver" value = "${driver}" />

這個元素在開發,測試和部署各階段都很有用。他可以使在多個不同的環境重新配置應用和使用自動生成工具(如ANT)變得容易。屬性檔案可以從類路徑中載入(使用resource屬性),也可以從合法的URL中載入(使用url屬性)。例如,要載入固定路徑的屬性檔案,使用:

<properties url = "file:///c:/config/my.properties" />


<setting>元素

<setting>元素用於配置和優化SqlMapClient例項的各選項。<setting>元素本身及其所有的屬性都是可選的。以下列出了<setting>元素支援的屬性及其功能:

  • maxRequests
同時執行SQL語句的最大執行緒數。大於這個值的執行緒將阻塞直到另一個執行緒執行完成。不同的DBMS有不同的限制值,但任何資料庫都有這些限制。通常這個值應該至少是maxTransactions(參加以下)的10倍,並且總是大於maxSessions和maxTranactions。減少這個引數值通常能提高效能。例如:maxRequests = "250"。
預設值:512.

  • maxSessions
同一時間內活動的最大session數。一個session可以是程式碼請求的顯式session,也可以是當執行緒使用SqlMapClient例項(即執行一條語句)自動獲得的session。它應該總是大於或等於maxTransactions並小於maxRequests。減少這個引數值通常能減少記憶體使用。例如:maxSessions = "64"。
預設值:128

  • maxTransactions
同時進入SqlMapClient.startTransaction()的最大執行緒數。大於這個值得執行緒將阻塞直到另一個執行緒退出。不同的DBMS有不同的限制值,但任何資料庫都有這些限制。這個引數值應該總是小於或等於maxSessions並總是遠遠小於maxRequests。減小這個引數值通常能提高效能。例如:maxTransactions = "16"。
預設值:32

  • cacheModelsEnabled
全域性性地啟用或禁用SqlMapClient的所有快取model。除錯程式時使用。例如:cacheModelsEnabled = "true"
預設值:true(啟用)

  • lazyLoadingEnabled
全域性性地啟用或禁用SqlMapClient的所有延遲載入。除錯程式時使用。例子:lazyLoadingEnabled = "true"
預設值:true(啟用)

  • enhancementEnabled
全域性性地啟用或禁用執行時位元組碼增強,以優化訪問JavaBean屬性的效能,同時優化延遲載入的效能。例子:enhancementEnabled = "true"
預設值:false(禁用)

  • useStatementNamespaces
如果啟用本屬性,必須使用全限定名來引用mapped statement。Mapped statement的全限定名由sql-map的名稱和mapped-statement的名稱合成。例如:queryForObject("sqlMapName.statementName");例如:useStatementNamespaces = "false"。
預設值:false(禁用)


<typeAlias>元素
<typeAlias>元素讓您為一個通常較長的、全限定類名指定一個較短的別名。例如:
<typeAlias alias = "shortname" type = "com.long.class.path.Class" />
在SQL Map配置檔案預定義了幾個別名,他們是:
  • 事務管理器別名:
JDBCcom.ibatis.sqlmap.engine.trnasaction.jdbc.JdbcTransactionConfig
JTAcom.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
EXTERNALcom.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig

  • Data Source Factory別名
SIMPLE com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
DBCP com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
JNDI com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

<transactionManager>元素
1.0轉換注意事項:SQL Map1.0允許配置多個資料來源。這引起了不好的實踐。因此,2.0版本只允許一個資料來源。要使用多個部署/配置引數,您最好使用多個屬性檔案,不同的系統使用不同的屬性檔案,或在建立SQL Map時傳入不同的屬性檔案。

<transactionManager>元素讓您為SQL Map配置事務管理服務。屬性type指定所使用的事務管理器型別。這個屬性值可以是一個類名,也可以是一個別名。包含在框架的三個事務管理器分別是:JDBC、JTA和EXTERNAL。
  • JDBC:
通過常用的Connection commit()和rollback()方法,讓JDBC管理事務。
  • JTA:
本事務管理器使用JTA全域性事務,使SQL Map的事務包括在更大的事務範圍內,這個更大的事務範圍可能包括了其他的資料庫和事務資源。這個配置需要一個 UserTransaction屬性,以便從JNDI獲得一個UserTransaction。
  • EXTERNAL:
這個配置可以讓您自己管理事務。您仍然可以配置一個資料來源,但事務不再作為框架生命週期的一部分被提交或回退。這意味著SQL Map外部應用的一部分必須自己管理 事務。這個配置也可以用於沒有事務管理的資料庫(例如只讀資料庫)。

<datasource>元素
<datasource>是<transactionManager>的一部分,為SQL Map資料來源設定了一系列引數。目前SQL Map架構只提供三個DataSource Factory,但您也可以新增自己的實現。下面詳細地討論DataSourceFactory的三個實現及其例子。
  • SimpleDataSourceFactory
SimpleDataSourceFactory為DataSource提供了一個基本的實現,適用於在沒有J2EE容器提供DataSource的情況。它基於iBatis的SimpleDataSource連線池實現。

<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.MaximumldleConnections" 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>

  • DbcpDataSourceFactory
DbcpDataSourceFactory實現使用Jakarta DBCP(Database Connection Pool)的DataSource API提供連線池服務。適用於應用/Web容器不提供DataSource服務的情 況,或執行一個單獨的應用。DbcpDataSourceFactory中必須要配置的引數例子如下:

<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.MaximumldleConnections" 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>

  • JndiDataSourceFactory
JndiDataSourceFactory在應用容器內部JNDI Context中查詢DataSource實現。當使用應用伺服器,並且伺服器提供了容器管理的連線池和相關DataSource實現的情況 下,可以使用JNDIDataSourceFactory。使用JDBC DataSource的標準方法是通過JNDI來查詢。JNDIDataSourceFactory必須要配置的屬性如下:
<transactionManager type ="JDBC">
<dataSource type ="JNDI">
<property name = "DataSource" value = "java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
以上配置使用了常用的JDBC事務管理。但對於容器管理的資源,您可能需要像下面的例子一樣配置,讓它能和全域性事務一起工作:
<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屬性指向UserTransaction例項所在的JNDI位置。JTA事務管理需要它,以使SQL Map能夠參與涉及其他資料庫和事務資源的範圍更大的事務。

<sqlMap>元素
<sqlMap>元素用於包括SQL Map對映檔案和其他的SQL Map配置檔案。每個SQLMapClient物件使用的所有SQL Map對映檔案都要在此宣告。對映檔案作為stream resource從類路徑或URL讀入。您必須在這裡指定所有的SQL Map檔案。例子如下:
<! -- CLASSPATH SOURCES -->
< sqlMap resource = "com/ibatis/examples/sql/Customer.xml" />
< sqlMap resource = "com/ibatis/examples/sql/Account.xml" />
< sqlMap resource = "com/ibatis/examples/sql/Product.xml" />
<!-- URL RESOURCES -->
< sqlMap resource = "file:///c:/config/Customer.xml" />
< sqlMap resource = "file:///c:/config/Customer.xml" />
< sqlMap resource = "file:///c:/config/Customer.xml" />

相關文章