[RESOLVIDO] Erro Transação EJB

6 respostas
R

Srs estou recebendo esta exception quando executo um Ebj Stateless que abre um arquivo deuns 30000 linhas e e faz um looping em cada linha do arquivo fazendo insert em uma base mysql com alguns dados da
linha do arquivo lido.

java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction is not active!
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1379)
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)

O EJB é um codigo pequeno que recebe por injeção o mysql

@Stateful(name="Cotacao")
@Remote(value=ICotacaoRemote.class)
@RemoteBinding(jndiBinding="br.com.foxtec.bovespa.ICotacaoRemote")
public class Cotacao implements ICotacaoRemote {
	@Resource(name="jdbc/MySQLDB" , mappedName = "java:/MySQLDB")
	private DataSource dataSource;
	private Connection con;
	
	@PostConstruct
	public void initialized() {
		try {
			con = dataSource.getConnection();

e tem um método que faz insert em loop.

while (in.ready()) { // Loop para cada linha do arquivo texto aberto 
	            	PreparedStatement pstmt = con.prepareStatement("INSERT INTO papeisnegociados (codigo, nomeEmpresa, valorNegociado, qtdNegociado, dataNegociacao) values (?,?,?,?,?)");
	                str = in.readLine();	                
	                if (str.substring(0,2).equals("02") && str.substring(111,116).equals("VISTA") && (str.substring(133,135).equals("ON") || str.substring(133,135).equals("PN"))) {
	                	String codigo = str.substring(2,12).trim();
	                	this.obterDadosNegociacao(codigo);	                	
	                	PapelEntity papel = this.obterDadosNegociacao(codigo);
	                	try {
	            			pstmt.setString(1, papel.getCodigo());
	            			if (papel.getNomeEmpresa() != null) {
	            				pstmt.setString(2, papel.getNomeEmpresa());
	            			} else {
	            				pstmt.setNull(2, Types.VARCHAR);
	            			}
	            			if (papel.getValorNegociado() != null) {
	            				pstmt.setDouble(3, papel.getValorNegociado());
	            			} else {
	            				pstmt.setNull(3, Types.DOUBLE);
	            			}	            			
	            			if (papel.getQtdNegociado() != null) {
	            				pstmt.setInt(4, papel.getQtdNegociado());
	            			} else {
	            				pstmt.setNull(4, Types.INTEGER);
	            			}
	            			pstmt.setTimestamp(5, new Timestamp(new Date().getTime()));
	            			pstmt.executeUpdate();
	            		
	                		
	            		} catch (Exception e) {
	            			e.printStackTrace();
	            			break;
	            		}
	                }
	                pstmt.close();
	            }

Geralmente quando ele chega na linha 160, as vezes 140 ou 150 ele retorna a exception.
Alguem tem uma dica do que eu possa verificar para solucionar o erro ?
Não coloquei nenhuma anotação de transação pois imagino que o defaul é o conteiner controlar
Estou usando o jboss 4.2.3

6 Respostas

F

Parece que está dando Timeout na transação. Pra quanto está configurado?

R

aumentei de 5 para 30 minutos jo JBOSS mas nada, continua na mesma

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
    <local-tx-datasource>
        <!-- This connection pool will be bound into JNDI with the name
             "java:/MySQLDB" -->

        <jndi-name>MySQLDB</jndi-name>
        <connection-url>jdbc:mysql://localhost:3306/cyoko</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <user-name>root</user-name>
        <password>mysql</password>

        <min-pool-size>5</min-pool-size>

        <!-- Don't set this any higher than max_connections on your
         MySQL server, usually this should be a 10 or a few 10's
         of connections, not hundreds or thousands -->

        <max-pool-size>20</max-pool-size>

        <!-- Don't allow connections to hang out idle too long,
         never longer than what wait_timeout is set to on the
         server...A few minutes is usually okay here,
         it depends on your application
         and how much spikey load it will see -->

        <idle-timeout-minutes>30</idle-timeout-minutes>

        <!-- If you're using Connector/J 3.1.8 or newer, you can use
             our implementation of these to increase the robustness
             of the connection pool. -->

        <exception-sorter-class-name>
  com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
        </exception-sorter-class-name>
        <valid-connection-checker-class-name>
  com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker
        </valid-connection-checker-class-name>

    </local-tx-datasource>
</datasources>
F
rogeriosantos77:
aumentei de 5 para 30 minutos jo JBOSS mas nada, continua na mesma
<?xml version="1.0" encoding="UTF-8"?>

<datasources>
    <local-tx-datasource>
        <!-- This connection pool will be bound into JNDI with the name
             "java:/MySQLDB" -->

        <jndi-name>MySQLDB</jndi-name>
        <connection-url>jdbc:mysql://localhost:3306/cyoko</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <user-name>root</user-name>
        <password>mysql</password>

        <min-pool-size>5</min-pool-size>

        <!-- Don't set this any higher than max_connections on your
         MySQL server, usually this should be a 10 or a few 10's
         of connections, not hundreds or thousands -->

        <max-pool-size>20</max-pool-size>

        <!-- Don't allow connections to hang out idle too long,
         never longer than what wait_timeout is set to on the
         server...A few minutes is usually okay here,
         it depends on your application
         and how much spikey load it will see -->

        <idle-timeout-minutes>30</idle-timeout-minutes>

        <!-- If you're using Connector/J 3.1.8 or newer, you can use
             our implementation of these to increase the robustness
             of the connection pool. -->

        <exception-sorter-class-name>
  com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
        </exception-sorter-class-name>
        <valid-connection-checker-class-name>
  com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker
        </valid-connection-checker-class-name>

    </local-tx-datasource>
</datasources>

Cara, acho que nao eh ai nao que configura o timeout.

Eh o timeout da transação que vc tem que configurar.

http://www.jboss.org/community/wiki/TransactionTimeout

R

CAra era isso mesmo. Valeu

F

Opa, flww :smiley:

T

Valeu, ajudou bastante

Criado 9 de dezembro de 2009
Ultima resposta 4 de nov. de 2015
Respostas 6
Participantes 3