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小记 阅读(304) | 评论 (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小记 阅读(1200) | 评论 (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小记 阅读(1560) | 评论 (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小记 阅读(245) | 评论 (0)编辑 收藏
网上有人说:"用写字板打开xml文件 重新保存一次就好了"
照做,OK了.

用utrlEdit编辑查看十六进制两者还是相同的,真莫名其妙.
posted @ 2005-11-20 19:37 java小记 阅读(790) | 评论 (0)编辑 收藏
仅列出标题
共4页: 上一页 1 2 3 4 

<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜