posts - 35,  comments - 7,  trackbacks - 0
           JDBC 3.0 提供了getGeneratedKeys(),可以獲取自增關鍵字的值,不需要重新再做一次select操作。

          String sql = "INSERT INTO CUSTOMERS(name,sex,age)values(?,?,?);";
                      PreparedStatement pstmt 
          = conn.prepareStatement(sql);
                      pstmt.setString(
          1, customer.getName());
                      pstmt.setString(
          2, customer.getSex());
                      pstmt.setInt(
          3, customer.getAge());
                      pstmt.execute();
                      ResultSet rs 
          = pstmt.getGeneratedKeys();
                      rs.next();
                      result 
          = new Long(rs.getLong(1));
                      pstmt.close();
          posted @ 2005-11-29 09:18 java小記 閱讀(306) | 評論 (0)編輯 收藏


          事務不應該由dao管理,而應該由service管理

          最重要的是如下四個類
          DataSource :數據庫的Connection連接工廠
          DataSourceUtils:
          參與同一個事務的多個dao實際上應該是共享同一個conn的。
          DataSourceUtils.getConnection(dataSource)取得當前ThreadLocal的conn,如果沒有從dataSource創建一個。
          DataSourceUtils.releaseConnection(conn, dataSource)未必真正關閉連接。
          DataSourceTransactionManager
          TransactionProxyFactoryBean;攔截具體業務對象方法調用,中間根據DataSourceTransactionManager設置進行事務管理

          文筆不行,說不明白,舉個例子:

           dao1{
             method(){
               conn= DataSourceUtils.getConnection(dataSource);
                ...........
               DataSourceUtils.releaseConnection(conn, dataSource);
             }
           }
           
           dao2{
             method(){
               conn= DataSourceUtils.getConnection(dataSource);
                ...........
               DataSourceUtils.releaseConnection(conn, dataSource);
             }
           }
           
           service{   method();  }
           
           serviceImp{
             method(){
                dao1.method();
                dao2.method();
             }
           }
           
           
           <bean id="dataSource"
                 class="org.apache.commons.dbcp.BasicDataSource"
                 destroy-method="close">
           </bean>     
           <bean id="transactionManager"
                 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
               <property name="dataSource">
                     <ref local="dataSource" />
               </property>
            </bean> 
            <bean id="service"
                    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                 <property name="transactionManager">
                    <ref bean="transactionManager" />
                 </property>
                 <property name="target">
                    <ref local="serviceImp" />
                 </property>
                 <property name="transactionAttributes">
                    <props>
                      <prop key="*">PROPAGATION_REQUIRED</prop>
                    </props>
                 </property>
            </bean> 

          分析:
          當調用service.method()時,開始TransactionProxyFactoryBean攔截此方法指定當前線程需要事務,然后調用dao1.method(),
          調用conn= DataSourceUtils.getConnection(dataSource)
          判斷當前線程還沒有conn則創建一個,因為此時線程需要事務所以conn.setAutoCommit(false),執行數據庫作,
          然后DataSourceUtils.releaseConnection(conn, dataSource),判斷當前線程需要事務所以不真正關閉連接繼續,dao1.method()返回。
          調用dao2.method(),調用conn= DataSourceUtils.getConnection(dataSource)判斷當前線程有一個conn就返回這個conn,(此時dao1.method()和dao2.method()已經共用了這個conn),執行數據庫操作,然后DataSourceUtils.releaseConnection(conn, dataSource),判斷當前線程需要事務
          所以不真正關閉連接繼續,dao2.method()返回。service.method()返回,TransactionProxyFactoryBean攔截取得當前線程連接提交事務,關閉清除連接。這樣兩個dao就參與到了一個事務當中。如果service.method()拋出異常,則TransactionProxyFactoryBean在service.method()返回時攔截取得當前線程連接回滾事務,關閉清除連接。

          不知道猜得對不對

          posted @ 2005-11-26 11:13 java小記 閱讀(1202) | 評論 (1)編輯 收藏
          結果就是兩行代碼的問題

          使用spring管理DataSource事務管理,需要采用一個特定的編碼規范。需要以一個特殊的方式獲得連接資源或者會話資源,允許相關的 PlatformTransactionManager實現跟蹤連接的使用,并且當需要時應用事務管理。
          不應該調用一個數據源的 getConnection()方法和Connection的close()方法,而必須使用Spring的 org.springframework.jdbc.datasource.DataSourceUtils類,如下:
          Connection conn = DataSourceUtils.getConnection(dataSource);
               .......................
          DataSourceUtils.releaseConnection(conn, dataSource);

          我就是調用了Connection conn = dataSource.getConnection();
                                     ................................
                                  conn.close();
          結果郁悶了兩天,一行代碼一天

          posted @ 2005-11-25 10:36 java小記 閱讀(1564) | 評論 (2)編輯 收藏
          我們現在面臨的選擇實在是太多,Windows VS. Linux,.Net VS. J2EE,Struts VS. JSF,等等等等。現在幾乎是每走出一步,往往都需要做出非常慎重的選擇,這個選擇很是痛苦,生怕選錯了以后,回頭路不好走。有一點我們不能選擇,即是自己的性別,是男是女,聽天由命,但都活得很好,很少有人為此要死要活的。這個最基本的底線我們都能接受,反而在身外之物上無法抉擇。其實我們很幸運,可以同時使用Windows及Linux,.Net及J2EE,Struts及JSF,盡管我們不能同時既當男的又是女的。選擇多了,欲望多了,反倒更累。

          就像男女問題,選好一條路,認真走下去,至死不悔。當然,必要時可以做做變性手術,體會一下另一半的滋味。


          作者:Sarkuya
          地址:http://www.matrix.org.cn/resource/article/43/43863_Spring_EJB3.html
          關鍵字:Spring EJB3.0 男女問題
          posted @ 2005-11-21 12:35 java小記 閱讀(249) | 評論 (0)編輯 收藏
          網上有人說:"用寫字板打開xml文件 重新保存一次就好了"
          照做,OK了.

          用utrlEdit編輯查看十六進制兩者還是相同的,真莫名其妙.
          posted @ 2005-11-20 19:37 java小記 閱讀(792) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桃源县| 张掖市| 福海县| 香格里拉县| 宣汉县| 连南| 绥德县| 长葛市| 富蕴县| 高要市| 武夷山市| 通渭县| 木兰县| 海阳市| 淮滨县| 泉州市| 清流县| 抚州市| 东港市| 通化县| 民和| 白水县| 桐梓县| 濮阳市| 罗田县| 高淳县| 宝鸡市| 岗巴县| 荔浦县| 黑龙江省| 乌苏市| 大渡口区| 濉溪县| 藁城市| 张家界市| 吴桥县| 鱼台县| 巴塘县| 朝阳市| 屏山县| 凤冈县|