//取得数据源
package com.tyy.pub;
import java.sql.*;
import javax.naming.*;
import java.util.Hashtable;public class DbCon implements java.io.Serializable {    public static Connection getConnection()throws Exception{
        try{
                Hashtable hs=new Hashtable();
                hs.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
                hs.put(Context.PROVIDER_URL,"t3://localhost:7003");
                Context ctx=new javax.naming.InitialContext(hs);
                javax.sql.DataSource ds=(javax.sql.DataSource)ctx.lookup("hop");
                return ds.getConnection();
        }catch(Exception ex){
                ex.printStackTrace();
                throw ex;
        }
}
}

解决方案 »

  1.   

    你的JTA事务是关闭的,不准许你再次提交事务。你把事物状态打开!
      

  2.   

    //EJB (sessionBean)
    /*
    package com.tyy.ejb;import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;
    import javax.ejb.CreateException;
    import com.tyy.pub.Contract;
    import com.tyy.pub.HbContracts;
    import com.tyy.pub.AdvertItems;
    import java.util.*;
    import com.tyy.pub.DbCon;
    import com.tyy.pub.ChangeGB;
    import java.sql.*;
    import java.sql.Date;public class AddSessionBean
        implements SessionBean {
      SessionContext sessionContext;
      Connection con;
      public void ejbCreate() throws CreateException {
        try{
          con=DbCon.getConnection();
        }catch(Exception e){
          throw new CreateException(e.getMessage());
        }
      }  public void ejbRemove() {
      }  public void ejbActivate() {
      }  public void ejbPassivate() {
      }  public void setSessionContext(SessionContext sessionContext) {
        this.sessionContext = sessionContext;
      }//辅助方法 设置合同主表预编译SQL参数  private void setCoValue(PreparedStatement pstm,Contract co){
                                   .
                                   . 
                                   .
    }  //辅助方法 设置合同号薄表预编译SQL参数
      private void setHcValue(PreparedStatement pstm,HbContracts hbc){
        
                                   .
                                   . 
                                   .
    }  //辅助方法 设置号薄广告表预编译SQL参数
      private void setItValue(PreparedStatement pstm,AdvertItems it){                               .
                                   . 
                                   .
    }
    //主要的业务逻辑  订立一个合同,关联到3个表
      public void addContract(Contract co, Collection hc, Collection ait) throws Exception{
        PreparedStatement hbpstm = null;
        PreparedStatement itPstm = null;
        try{
          //添加合同主表
    PreparedStatement pstm =
                con.prepareStatement("insert into contracts (contract_id,name,address,line_nbr,city_code,qy_code,area_code," +
                                     "post_code,link_tele,link_man,fax_nbr,advert_man,contract_fee,contract_date,input_date,input_man" +
                                     ",modi_date,handle_id,ename,eaddress,follow_man,follow_fee,follow_date,deduct_type,team_code)" +
                                     " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,)");
            setCoValue(pstm, co);
            pstm.executeUpdate();
            pstm.close();        //添加合同号薄表
            Iterator hcit = hc.iterator();
            while (hcit.hasNext()) {
              HbContracts hbc = (HbContracts) hcit.next();          hbpstm = con.prepareStatement("insert into hb_contracts(contract_id,hb_name,new_id,prior_hb,book_count,prior_fee,discount" +
                                            ",contract_fee,less_fee)values(?,?,?,?,?,?,?,?,?)");
              hbpstm.setString(1, co.getContract_id());
              setHcValue(hbpstm, hbc);
              hbpstm.executeUpdate();
                hbpstm.close();
              System.out.println("添加合同号薄表");
            }
            //添加号薄广告表
            Iterator it = ait.iterator();
            while (it.hasNext()) {
              AdvertItems adIt = (AdvertItems) it.next();
              itPstm = con.prepareStatement("insert into advert_items (contract_id,hb_name,advert_code,advert_type,advert_fee" +
                                            ",cust_class,spec_need) values (?,?,?,?,?,?,?)");
              itPstm.setString(1, co.getContract_id());
              setItValue(itPstm, adIt);
              itPstm.executeUpdate();
              itPstm.close();
              System.out.println("添加号薄广告表");
            }    }catch(Exception e){
          e.printStackTrace();
        }
        finally{
        try{
          if(hbpstm!=null){
            hbpstm.close();
          }
          if(itPstm!=null){
            itPstm.close();
          }
          if(con!=null){
             con.commit();
              con.close();
            }
            }catch(Exception e){
            }
          }
        }
      }调用第一次可以正确的添加,调用第2次就报哪个错误,重起weblogic后又可以添加了。*/
      

  3.   

    [ Queen_D(小菜) ]你的JTA事务是关闭的,不准许你再次提交事务。你把事物状态打开!我好象没使用事务呀??
    另:要是使用了,怎么打开呢?我是菜鸟:)
      

  4.   

    if(con!=null){
             con.commit();
              con.close();
            }
    注意con.commit();
      

  5.   

    默认的Connection是做自动提交的,所以你要自己做commit的话,首先要把connection的setAutoCommit设置成false
      

  6.   

    事务的问题,setAutoCommit(false);con.commit();
      

  7.   

    我把con.commit();去掉,还是一样。好晕,我用的是WEBLOGIC+JB+SYBASE