【问题标题】:java servlets: better way to do multiple inserts and locking tables?java servlets:更好的方法来做多个插入和锁定表?
【发布时间】:2009-05-22 16:53:01
【问题描述】:

我目前正在使用建议的 PareparedStatement 类在 java servlet 中运行以下代码段。它目前正在将库存数据插入到会计系统的 SQL Server 数据库中。我有两个问题。

  1. 由于insert语句将数据插入到3个不同的表中,我应该将这些sql语句移动到数据库上的tsql过程调用并使用Transaction锁定表吗?
  2. 每当用户打开会计软件清单屏幕时,最后 2 个插入语句都会失败。我猜软件客户端会在用户打开屏幕时锁定表格。

代码如下:

try {   

        con = java.sql.DriverManager.getConnection(getConnectionUrl()); 
        //get next itemkey 
        CallableStatement cstmt = con.prepareCall("{call spGetNextSurrogateKey (?,?)}");
        cstmt.setString("iTableName","timitem");
        cstmt.registerOutParameter("oNewKey", java.sql.Types.INTEGER);
        cstmt.execute(); 
        int rs4 = cstmt.getInt(2);
        cstmt.close();

        String query = "insert into timitem (itemkey, AllowCostOvrd,AllowDecimalQty,AllowDropShip,AllowPriceOvrd,AllowRtrns,AvailForSale,CompanyID,CreateDate,CreateUserID,CreateType,DateEstab,DfltSaleQty,HazMat,InclOnPackList,InternalLongDesc,IntrnlDeliveryReq,ItemClassKey,ItemID,ItemSubType,ItemType,MinGrossProfitPct,MinSaleQty,PerUsageOrdLimit,PriceSeq,PriceUnitMeaskey,PurchProdLineKey,PurchUnitMeasKey,RcptReq,RestockRate,SaleMultiple,SalesUnitMeasKey,Seasonal,ShelfLife,Status,STaxClasskey,StdPrice,StdUnitCost,StockUnitMeasKey,SubjToTradeDisc,TargetMargin,TrackMeth,UpdateCounter,ValuationMeth,WarrantyDays,WarrantyProvider) values ( '" +rs4 + "', 0,0,1,1,1,1,'ens','" + DateFormat.format(Date) + "','admin',1,'" + DateFormat.format(Date) + "',1,0,1,0,0,"+itemclasskey+",'" + partnumber + "',1,5,0,1,0,0,112,"+PurchProdLineKey+","+UnitMeasKey+",1,0,0,112,0,0,1,12,"+ itemlistprice + ","+itemcost + ",112,0,0,2,0,5,0,0)";
        PreparedStatement pstmt = con.prepareStatement(query); 
        pstmt.executeUpdate(); 
        pstmt.close();            

                String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values ('" + rs4 + "', 1033, '" + itemdescription + "','"+ "_" + "')";

                PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
        pstmt2.executeUpdate();                         
                pstmt2.close();

                String query_UOM = "insert into timItemUnitOfMeas (itemkey, TargetUnitMeasKey, conversionfactor, unitvolume, unitweight,upc,useforpurchases,useforsales,usestdconv) values ('" + rs4 + "', "+UnitMeasKey+", '1',0,0,NULL,0,0,0)";

                PreparedStatement pstmt3 = con.prepareStatement(query_UOM); 
        pstmt3.executeUpdate();                         
                pstmt3.close();


}catch(java.sql.SQLException e){ e.printStackTrace(); }     //end try 

有什么建议吗?提前致谢。

【问题讨论】:

    标签: java tsql servlets transactions


    【解决方案1】:

    在底层使用 JDBC,每条语句在执行时都会自动提交。要在单个事务中执行多个语句,请在 Connection 上调用 setAutoCommit(false),然后在连接上调用 commit() 来完成工作单元。如果出现故障,请致电rollback()

    如今,更常见的是使用 JPA 等持久性机制来管理事务,与框架或容器一起工作。这种基础设施可以很好地处理常见的事务场景。

    【讨论】:

      【解决方案2】:

      我建议您不要在 servlet 中执行此操作。将代码移到可以离线测试的持久层中,无需 servlet 容器。

      我也推荐Spring and JPA。将您的应用分层,使 Web 和持久层不合二为一。

      http://java.sun.com/developer/technicalArticles/J2EE/jpa/ http://www.springsource.org/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        相关资源
        最近更新 更多