Непрерывный сбой источника данных - PullRequest
0 голосов
/ 21 сентября 2019

Я разрабатываю веб-приложение, используя JavaServer Faces для презентации, Wildly 17 в качестве контейнера и MySQL 8. В качестве базы данных.

Я развернул MySQL-коннектор 8.0.15 (файл .jar) и установилпараметры для источника данных, как описано в руководстве пользователя Wildfly.Подробно:

  • com.mysql.cj.jdbc.Driver для класса драйверов
  • минимальный размер пула: 10
  • максимальный размер пула: 20
  • пополнение пула: true

Теперь проблема в том, что выполнение самого простого запроса очень медленное (под простым запросом я имею в виду что-то вроде (select field from table, где в таблице 20строк).

Во всех случаях использования после определенного небольшого количества взаимодействий источник данных становится пустым, и единственный способ решить эту проблему - перезагрузить контейнер.

Запрос, который яхочу выполнить несколько раз в цикле while (потому что мне нужно увеличить временную метку и повторно выполнить запрос) сбой, как только задействовано более 144 строк (в соединении из 3 таблиц).

Inв этом случае после 10 минут выполнения я получаю следующее сообщение:

javax.ejb.EJBTransactionRolledbackException: javax.transaction.RollbackException: WFLYEJB0447:
Transaction 'Local transaction (delegate=TransactionImple < ac, BasicAction: 0:ffffc0a80107:1a1a9a9e:5d85e7db:17 status: ActionStatus.ABORTED >,
owner=Local transaction context for provider JBoss JTA transaction provider)' was already rolled back

Вот некоторые строки трассировки стека (слишком долго, чтобы консоль не могла поддерживать все строки).

Самая длинная таблица содержит 200 000 строк.

Объявление EJB

@Remote
public interface DatabaseDriver{

...

}

@Stateful
public class DatabaseDriverImpl implements DatabaseDriver {

...

    @Resource(lookup = "java:/MySqlDS")
    DataSource ds;

...

}

А вот метод, который приводит к аварийному завершению

public List<AggregateResult> getAggregatePrecipitation(String stationSn, Timestamp startDate, Timestamp stopDate, long scaleFactor){

    if(GlobalVariables.debug) {
        System.out.println(TAG + " enter getAggregatePrecipitation");
    }

    //Converto lo scaleFactor da ore a millisecondi
    scaleFactor = scaleFactor * 60 * 60 * 1000;

    //Converto i timestamp passati in millisecondi
    long startMillis = startDate.getTime();
    long stopMillis = stopDate.getTime();

    //Variablie incrementale
    long currStopMillis = startMillis + scaleFactor;

    //Risultato
    float currRes = 0;
    AggregateResult apr = null;
    List<AggregateResult> res = new ArrayList<AggregateResult>();

    Connection connection = null;

    try {

        connection = ds.getConnection();

        if(testConnection(connection)) {

            if(GlobalVariables.verbose) {
                System.out.println(TAG + " execute query");
            }

            while(currStopMillis < stopMillis) {

                startDate = new Timestamp(startMillis);
                stopDate = new Timestamp(currStopMillis);

                CallableStatement cs = connection.prepareCall("{call " + "GET_AGGREGATE_PRECIPITATION(?, ?, ?, ?)}"); 
                cs.setString(1, stationSn);
                cs.setTimestamp(2, startDate);
                cs.setTimestamp(3, stopDate);
                cs.registerOutParameter(4, java.sql.Types.FLOAT);
                cs.execute();

                currRes = cs.getFloat(4);
                apr = new AggregateResult(stopDate, currRes);
                res.add(apr);

                startMillis = currStopMillis;
                currStopMillis += scaleFactor;
            }

            if(GlobalVariables.verbose) {
                System.out.println(TAG + " query executed. Result: ");

                for(AggregateResult a : res) {
                    System.out.println(a);
                }
            }
        }

    }
    //TODO: Gestire l'eccezione
    catch(SQLException e) {
        e.printStackTrace();
    }
    finally {
        connection = null;
    }

    if(GlobalVariables.debug) {
        System.out.println(TAG + " exit getAggregatePrecipitation");
    }

    return res;
}

и хранимая процедура в базе данных

BEGIN
    set aggregatePrecipitation = (
        select sum(RG.value)
        from datum D, rain_gauge_datum RG, production P 
        where D.id = RG.id and P.ref_datum = D.id and D.data_type = 'RG'
        and P.ref_station = stationSn 
        and D.creation_date >= startDate and D.creation_date <= stopDate
    );
END

Журнал с исключением:

11:11:36,220 ERROR [org.jboss.as.ejb3] (default task-1) WFLYEJB0487: Unexpected invocation state 0
11:11:36,220 WARN  [com.arjuna.ats.arjuna] (default task-1) ARJUNA012077: Abort called on already aborted atomic action 0:ffffc0a80107:1a1a9a9e:5d85e7db:17
11:11:36,221 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: EJB Invocation failed on component DatabaseDriverImpl for method public abstract java.util.List it.idrologiaUnipa.dao.DatabaseDriver.getAllData(java.lang.String,java.sql.Timestamp,java.sql.Timestamp): javax.ejb.EJBTransactionRolledbackException: javax.transaction.RollbackException: WFLYEJB0447: Transaction 'Local transaction (delegate=TransactionImple < ac, BasicAction: 0:ffffc0a80107:1a1a9a9e:5d85e7db:17 status: ActionStatus.ABORTED >, owner=Local transaction context for provider JBoss JTA transaction provider)' was already rolled back

...

Caused by: javax.transaction.RollbackException: WFLYEJB0447: Transaction 'Local transaction (delegate=TransactionImple < ac, BasicAction: 0:ffffc0a80107:1a1a9a9e:5d85e7db:17 status: ActionStatus.ABORTED >, owner=Local transaction context for provider JBoss JTA transaction provider)' was already rolled back
    at org.jboss.as.ejb3@17.0.1.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:95)
    ... 119 more

...

Caused by: javax.transaction.RollbackException: WFLYEJB0447: Transaction 'Local transaction (delegate=TransactionImple < ac, BasicAction: 0:ffffc0a80107:1a1a9a9e:5d85e7db:17 status: ActionStatus.ABORTED >, owner=Local transaction context for provider JBoss JTA transaction provider)' was already rolled back
    at org.jboss.as.ejb3@17.0.1.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:95)
    ... 119 more

Тогда переменная источника данных стала нулевой.

11:51:18,749 ERROR [stderr] (default task-2) java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/MySqlDS

...
11:51:18,766 ERROR [stderr] (default task-2) Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/MySqlDS
11:51:18,766 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:690)
11:51:18,766 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440)
11:51:18,766 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789)
11:51:18,766 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.jdbcadapters@1.4.16.Final//org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:151)
11:51:18,766 ERROR [stderr] (default task-2)    ... 132 more
11:51:18,767 ERROR [stderr] (default task-2) Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (30000 [ms])
11:51:18,767 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:570)
11:51:18,767 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.pool.AbstractPool.getTransactionNewConnection(AbstractPool.java:714)
11:51:18,767 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:613)
11:51:18,767 ERROR [stderr] (default task-2)    at org.jboss.ironjacamar.impl@1.4.16.Final//org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:624)
11:51:18,767 ERROR [stderr] (default task-2)    ... 135 more
...