[Java] Nombre de connexions requises lors de l'imbrication des transactions

Le nombre de transactions imbriquées est-il = le nombre de connexions requises? ?? ??

Lors de l'estimation de la taille du pool du pool de connexions pour le traitement par lots multi-thread, l'imbrication des transactions se produit, donc ** bien sûr, le nombre de connexions imbriquées est également requis **, donc nombre de threads x nombre de transactions imbriquées J'ai défini la taille de la piscine.

Plus tard, j'étais vaguement inquiet de ** bien sûr ** en moi-même, en disant: "Est-ce vraiment le cas (besoin d'une partie de nidification?)" ** J'ai donc décidé de créer un exemple de code et de le vérifier.

Conclusion

Soudain, il n'y a plus ni corps ni couvercle, Nombre de transactions imbriquées = nombre de connexions requises était.

Donc, si vous voulez juste connaître le résultat, vous pouvez ignorer ce qui suit.

Environnement de vérification

Exemple de code (extrait)

application.properties


# ConnectionPool
spring.datasource.tomcat.maxActive=1
spring.datasource.tomcat.maxIdle=1
spring.datasource.tomcat.minIdle=0
spring.datasource.tomcat.initialSize=0

App.java


@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(App.class, args);
        Main bean = context.getBean(Main.class);
        bean.doNestedTransaction();
    }

}

Main.java


@Component
public class Main {

    @Autowired
    private MainTarnsaction mainTransaction;

    public void doNestedTransaction() {
        mainTransaction.beginTransaction();
    }

}

MainTarnsaction.java


@Component
public class MainTarnsaction {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private NestedTransaction nestedTransaction;

    @Transactional
    public void beginTransaction() {
        jdbcTemplate.execute("update Hoge set val = 'aaa' where id = '1'");
        nestedTransaction.beginTransaction();
    }

}

NestedTransaction.java


@Component
public class NestedTarnsaction {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void beginTransaction() {
        jdbcTemplate.execute("update Hoge set val = 'bbb' where id = '2'");
    }

}

Résultat d'exécution

(1) Lorsque la taille de la piscine est définie sur 1 ( spring.datasource.tomcat.maxActive = 1) et exécutée

org.springframework.transaction.CannnotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.tomcat.jdbc.pool.PoolExhaustedException: [main] Timeout: Pool empty. Unable to fetch a connection in 30 seconds. none available[size:1; busy:1; idel:0; lastwait:30000].
...
at xxx.NestedTransaction$$EnhancerBySpringCGLib$$xxx.beginTransaction(<generated>)
...
at xxx.MainTransaction$$EnhancerBySpringCGLib$$xxx.beginTransaction(<generated>)
at xxx.Main.doNestedTransaction(Main.java:xx)
...

Comme mentionné ci-dessus, la connexion pour la transaction imbriquée n'a pas pu être allouée à partir du pool et une exception s'est produite.

(2) Lorsque la taille de la piscine est définie sur 2 ( spring.datasource.tomcat.maxActive = 2) et exécutée

Il s'est terminé normalement (comme prévu).

en conclusion

Cela m'a fait me sentir rafraîchi. J'espère que cela sera utile à ceux qui ont rencontré la même question.

Recommended Posts

[Java] Nombre de connexions requises lors de l'imbrication des transactions
Comment trouver le nombre total de pages lors de la pagination en Java
[Java] Vérifiez le nombre d'occurrences de caractères
Vérification de l'impact sur les performances lors de l'utilisation de Java volatile
java (nombre aléatoire)
[Java] Présentation de Java
Awesome Java: excellent logiciel de bibliothèque de framework Java
Résumé des connaissances requises pour réussir Java SE8 Silver
[Java] Lors de l'écriture du source ... Mémorandum ①
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz