軟件藝術(shù)思考者  
          混沌,彷徨,立志,蓄勢(shì)...
          公告
          日歷
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          隨筆分類(lèi)(86)

          隨筆檔案(85)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          因?yàn)樾枰獙㈨?xiàng)目從IBM WebSphere Application Server移植到Tomcat上開(kāi)發(fā),所以研究了一下在Tomcat中通過(guò)JNDI查找和使用JDBC及JTA的方法。

          Tomcat是Servlet容器,但它也提供了一個(gè)JNDI InitialContext實(shí)現(xiàn),因此用戶(hù)可以像在J2EE應(yīng)用程序服務(wù)器中一樣在Tomcat中使用JNDI查找JDBC數(shù)據(jù)源。不過(guò)在事務(wù)處理方面,Tomcat本身并不支持JTA(Java Transaction API),所以需要借助其他的方案。JOTM(Java Open Transaction Manager)是ObjectWeb的一個(gè)開(kāi)源JTA實(shí)現(xiàn),它本身也是開(kāi)源應(yīng)用程序服務(wù)器JOnAS(Java Open Application Server)的一部分,為其提供JTA支持和分布式事務(wù)管理。JOTM同樣可以為T(mén)omcat提供JTA支持,以下將對(duì)相關(guān)的配置進(jìn)行簡(jiǎn)單說(shuō)明,使用的相應(yīng)版本為:

          Tomcat 5.5.x
          JOTM 2.0.x
          Oracle 9i

          1. 配置Tomcat環(huán)境

          在$TOMCAT_HOME/conf/context.xml文件中添加以下內(nèi)容:

          <Resource name="jdbc/framework" auth="Container"
          type="javax.sql.DataSource"
          factory="org.objectweb.jndi.DataSourceFactory"
          username="user" password="pwd"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          url="jdbc:oracle:thin:@172.18.136.200:1521:ORADB"
          maxActive="30" maxIdle="30"/>

          <Transaction factory="org.objectweb.jotm.UserTransactionFactory"
          jotm.timeout="60"/>

          2. 添加所需的JAR文件

          下載JOTM,將以下文件添加到$TOMCAT_HOME/common/lib/:
          jotm.jar
          jotm_jrmp_stubs.jar
          jotm_iiop_stubs.jar
          ow_carol.jar
          jta-spec1_0_1.jar
          jts1_0.jar
          objectweb-datasource.jar
          xapool.jar
          howl.jar
          connector-1_5.jar
          同時(shí),還需要添加相應(yīng)數(shù)據(jù)庫(kù)的JDBC包,例如Oracle的classes12.jar

          3. 配置JOTM

          新建一個(gè)carol.properties文件,置于$TOMCAT_HOME/common/classes/,文件內(nèi)容如下:

          # JNDI (Protocol Invocation)
          carol.protocols=jrmp

          # Local RMI Invocation
          carol.jvm.rmi.local.call=true

          # do not use CAROL JNDI wrapper
          carol.start.jndi=false

          # do not start a name server
          carol.start.ns=false

          # Naming Factory
          carol.jndi.java.naming.factory.url.pkgs=org.apache.naming

          這樣JOTM將不會(huì)使用CAROL JNDI wrapper,從而可以避免類(lèi)裝載錯(cuò)誤的發(fā)生

          4. 說(shuō)明

          4.1 JOTM目前的版本在JDK1.5或以上可能無(wú)法正常運(yùn)行,解決的方法有兩個(gè):使用JDK1.5重新編譯carol庫(kù),或者將Tomcat運(yùn)行在JDK1.4中

          4.2 <Transaction>是Tomcat 5中的新標(biāo)記,對(duì)于不支持此標(biāo)記的老版本,需要使用以下語(yǔ)句代替事務(wù)資源的聲明:

          <!-- Resource configuration for UserTransaction
          use JOTM
          -->
          <Resource name="UserTransaction" auth="Container"
          type="javax.transaction.UserTransaction"
          factory = "org.objectweb.jotm.UserTransactionFactory"
          jotm.timeout = "60"/>

          4.3 需要注意的是,使用<Resource>節(jié)點(diǎn)聲明的資源默認(rèn)上下文前綴是"java:comp/env",而使用< Transaction>節(jié)點(diǎn)時(shí)則是"java:comp"。因此,當(dāng)使用4.2的方式聲明用戶(hù)事務(wù)時(shí),相應(yīng)的JNDI查找代碼也應(yīng)該改為 UserTransaction ut = (UserTransaction)initCtx.lookup("java:comp/env/UserTransaction");

          5. 測(cè)試
          假設(shè)數(shù)據(jù)庫(kù)中已經(jīng)做了相應(yīng)配置,可以使用如下jsp頁(yè)面進(jìn)行測(cè)試:
          <!--test.jsp-->
          <%@page contentType="text/html;charset=GB2312"%>
          <%@page import="java.sql.*"%>
          <%@page import="javax.sql.*"%>
          <%@page import="javax.naming.*"%>
          <%@page import="javax.transaction.UserTransaction"%>
          <%
          ResultSet rs = null;
          Statement stmt = null;
          UserTransaction ut = null;
          Connection conn = null;
          try {
          Context initCtx = new InitialContext();
          Context envCtx = (Context) initCtx.lookup("java:comp/env");
          DataSource ds = (DataSource) envCtx.lookup("jdbc/framework");
          ut = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
          conn = ds.getConnection();

          ut.begin();
          System.out.println("<<< beginning the transaction >>>");

          stmt = conn.createStatement(
          // ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE
          );
          rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
          rs.next();
          } catch(Exception e) {e.printStackTrace();}
          %>
          <html>
          <body>
          Original price:
          <%=rs.getString("price")%>
          <br>After update:
          <%
          PreparedStatement pstmt = conn.prepareStatement("update tm_product set price=? where id=1");
          pstmt.setInt(1,101);
          pstmt.executeUpdate();
          rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
          rs.next();
          %>
          <%=rs.getString("price")%>
          <br>After Rollback:
          <%
          System.out.println("<<< rolling back the transaction >>>");
          ut.rollback();//Or ut.commit();
          rs = stmt.executeQuery("SELECT PRICE FROM TM_PRODUCT WHERE ID=1");
          rs.next();
          %>
          <%=rs.getString("price")%>
          <%conn.close();%>
          </body>
          </html>

          6. 參考
          How to use JDBC and transactions in Tomcat with JOTM
          How to use JDBC and transactions in Tomcat with JOTM(For Tomcat 5.5.x)
          UserTransaction, JOTM and Tomcat 5.5.x

          posted on 2006-09-21 14:55 智者無(wú)疆 閱讀(5605) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): about java
          評(píng)論:
           
          Copyright © 智者無(wú)疆 Powered by: 博客園 模板提供:滬江博客


             觀音菩薩贊

          主站蜘蛛池模板: 卢湾区| 抚宁县| 清丰县| 时尚| 台江县| 三台县| 五大连池市| 金华市| 潢川县| 永登县| 鄂尔多斯市| 遂昌县| 铜陵市| 六安市| 望江县| 射阳县| 襄垣县| 迁安市| 油尖旺区| 海盐县| 江华| 浙江省| 保德县| 营山县| 长泰县| 青铜峡市| 仁寿县| 阿拉善左旗| 革吉县| 江口县| 阿尔山市| 旅游| 焦作市| 县级市| 阿城市| 郴州市| 塔城市| 潞城市| 长治市| 勃利县| 长宁县|