01002:在XATransaction上取出序列

在相同的数据有时会抛出异常java.sql.SQLException:ORA-01002:抓取序列,但在大多数尝试都工作正常。

在Glassfish 3.1.2.2上运行的Java应用程序。 有人可以解释我,问题在哪里?

@Singleton
@LocalBean
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class MarketCodesSingleton {

    @Resource(mappedName="jdbc/sss")
    private DataSource source;

    private volatile static Map<Interval, String> marketCodes;

    @PostConstruct
    @Schedule(minute="*/10", hour="*")
    public void fillMarketCodes() {
        try(Connection conn = source.getConnection()) {
            Map<Interval, String> marketCodesInt = new TreeMap<>();
            DaoFactory.getMarketCodesDao().fillMarketCodes(marketCodesInt, conn);
            marketCodes = Collections.unmodifiableMap(marketCodesInt);
            Logger.getLogger(getClass().getName()).log(Level.FINE, "MarketCodes updated");
        } catch (SQLException e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "fillMarketCodes exception",e);
            throw new EJBException("fillMarketCodes exception",e);
        }
    }

    public String getMarketCode(Long msisdn) {
        Interval interval = new Interval(msisdn);
        return marketCodes.get(interval);
    }

}

DaoFactory.getMarketCodesDao()fillMarketCodes:

private static final String getMarketCodes_SQL = "CALL SERVICE_PKG.GET_MARKET_CODES(?)";

@Override
public void fillMarketCodes(Map<Interval, String> intervals, Connection conn) throws SQLException {      
    try (CallableStatement cs = conn.prepareCall(getMarketCodes_SQL)) {
        //-10 is a OracleTypes.CURSOR
        cs.registerOutParameter(1, -10);
        cs.execute();
        try (ResultSet rs = (ResultSet) cs.getObject(1)) {
            //*******Exception throws on the rs.next() in this method*******
            while (rs.next()) {
                Interval interval = new Interval(rs.getLong("from_no"), rs.getLong("to_no"));
                intervals.put(interval, rs.getString("market_code"));
            }
        }
    }
}

程序:

  procedure GET_MARKET_CODES(
    c_cursor OUT SYS_REFCURSOR
  ) AS
  BEGIN
    OPEN c_cursor FOR
      SELECT from_no, to_no, market_code
      FROM market_codes;
  END GET_MARKET_CODES;

连接属性:

<jdbc-connection-pool 
    connection-creation-retry-interval-in-seconds="5" 
    datasource-classname="oracle.jdbc.xa.client.OracleXADataSource" 
    max-pool-size="200" 
    max-connection-usage-count="1000" 
    res-type="javax.sql.XADataSource" 
    steady-pool-size="0" 
    name="sss_pool" 
    connection-creation-retry-attempts="5">
      <property name="URL" value="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = xx)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = xx)))"></property>
      <property name="Password" value="***"></property>
      <property name="User" value="***"></property>
</jdbc-connection-pool>

代码不完整,所以我只能猜测:

  • 光标被关闭并且您尝试再次获取
  • 您确实选择了更新并提交,然后尝试获取下一行。

  • 你的连接是否设置为自动提交? 通过提交或回滚进行提取可能会导致此异常。

    我还注意到,您的SQL没有像Oracle文档那样被begin / end包围,就像本示例和Oracle Javadoc一样。


    为了确定是否在处理异常时处理异常

    修改以下代码以包含计数器i以获取处理的行并查找实际的行数

     int i=0;
      try{
     while (rs.next()) {
                Interval interval = new Interval(rs.getLong("from_no"), rs.getLong("to_no"));
                intervals.put(interval, rs.getString("market_code"));
                i=i+1;
            }
    }
    catch (Exception e)
    {
     Logger.getLogger(getClass().getName()).log(Level.FINE, "the total rows processed"+ i);
     Statement stmt = null;
     String query = "select count(1) count_rows                   
                   from market_codes";
        stmt = con.createStatement();
        ResultSet rs1 = stmt.executeQuery(query);
        rs1.next();
        String countRows = rs1.getString("count_rows");
        Logger.getLogger(getClass().getName()).log(Level.FINE,"Actual count of rows"+ countRows);
     }
    
    链接地址: http://www.djcxy.com/p/17545.html

    上一篇: 01002: fetch out of sequence on XATransaction

    下一篇: Finalizers for JavaScript objects