java.sql.SQLException: ORA-01002: fetch out of sequence auf XATransaction

Auf die gleichen Daten manchmal wirft die exception java.sql.SQLException: ORA-01002: fetch out of sequence, aber in den meisten versucht, alle feinen arbeiten.

Java-app läuft auf Glassfish 3.1.2.2. Kann jemand mir erklären, wo ist das problem?

@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"));
            }
        }
    }
}

Verfahren:

  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;

Verbindung Eigenschaften:

<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>
  • Könntest du bitte posten Sie Ihre JDBC-Verbindung params?
  • Verbindung params Hinzugefügt wurden
  • Versuchen Sie, KeepXAConnTillTxComplete="true", "Kräfte der connection pool zu reservieren, eine physische Datenbank-Verbindung und der Aufrechterhaltung einer Verbindung zu einer Anwendung über die Transaktion, die Verarbeitung, das heißt, bis die verteilte Transaktion abgeschlossen ist." Vielleicht ist Ihr problem wird verursacht, da der XA-Transaktions-Kontext eine Verbindung verpasst, während ein ResultSet-Verarbeitung.
  • Ich habe auch festgestellt, diese Beratung im web 🙂 Aber ich bin nicht sicher, dass es angemessen für Glassfish. Ich denke, dass es nur für den Weblogic - docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/...
InformationsquelleAutor shurik2533 | 2013-11-28
Schreibe einen Kommentar