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.
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.
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'");
}
}
(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).
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