假設安裝路徑:C:\jboss-3.2.1_tomcat-4.1.24,使用default配置集。
JBoss 內建主流資料庫範例於 docs/examples/jca/。以 SQL Server 2000 為例:
mssql-ds.xml 至 server/default/deploy/<datasources>
<local-tx-datasource>
<jndi-name>VSSDB</jndi-name>
<connection-url>jdbc:microsoft:sqlserver://125.16.45.158:1433;DatabaseName=DDD</connection-url>
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>
<user-name>sa</user-name>
<password>sa</password>
<min-pool-size>50</min-pool-size>
<max-pool-size>200</max-pool-size>
</local-tx-datasource>
</datasources>
若 EJB 需使用此 DataSource,需修改 server/default/conf/standardjbosscmp-jdbc.xml:
<defaults>
<datasource>java:/VSSDB</datasource>
<datasource-mapping>MS SQLSERVER2000</datasource-mapping>
<create-table>true</create-table>
<remove-table>false</remove-table>
...
</defaults>
注意: java:/ 前綴表示僅 JBoss 內部可見,外部應用無法使用。
JBoss 擴展 Log4j,配置檔 server/default/conf/log4j.xml。調整主控台輸出至 DEBUG:
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<param name="Threshold" value="DEBUG"/> <!-- 原為 INFO -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
Entity Bean 調試需同步修改 standardjboss.xml,將 Standard CMP 2.x EntityBean 的 call-logging 設為 true,主控台將顯示 JDBC 呼叫細節。
整合版位於 server/default/deploy/jbossweb-tomcat.sar/:
web.xml:擴充 MIME 型別、Session 逾時等META-INF/jboss-service.xml:HTTP 埠號(預設 8080,改 80 需修改此處)server/default/lib/(非 JBoss 根目錄 lib).war 或 .ear 的 WEB-INF/lib/JBoss 提供 A/B/C/D 四種提交選項。若僅 Entity Bean 存取資料庫,選 A 最佳;若有其他存取途徑,需根據具體情況選擇,並配合鎖定策略降低死鎖風險。優先採用 1:n 關聯操作 n 端資料表,提升容器效率。
SessionContext.getUserTransaction() 取得,不可 JNDI 查找// JDBC 事務
public void processT(String orders) {
Connection conn = ds.getConnection();
try {
conn.setAutoCommit(false);
orderNo = createOrder(orders);
updateOrderStatus(orderNo, "orders created");
conn.commit();
} catch (Exception e) {
conn.rollback();
throw new EJBException("事務回滾: " + e.getMessage());
}
}
// JTA 事務
public void processOrder(String orderMessage) {
UserTransaction tx = sessionContext.getUserTransaction();
try {
tx.begin();
orderNo = sendOrder(orderMessage);
updateOrderStatus(orderNo, "order sent");
tx.commit();
} catch (Exception e) {
tx.rollback();
throw new EJBException("事務回滾: " + e.getMessage());
}
}
EJBException, NoSuchEntityException) 觸發回滾,應用級異常不會回滾。Session Bean + JDBC + JTA 靈活。