2017-09-06 11 views
1

L'exception est levée lorsque vous tentez de suspendre le pool HikariCP en simulant une panne de connexion réseau pendant quelques secondes. Pourquoi la piscine ne peut-elle pas être suspendue? Existe-t-il d'autres moyens simples de simuler une connexion réseau perdue (vers un serveur MySQL sur localhost)?Impossible de suspendre HikariCP

Configuration:

final String configFile = "src/main/resources/db.properties"; 
HikariConfig config = new HikariConfig(configFile); 
config.setRegisterMbeans(true); 
config.setPoolName("hikari-pool-1"); 
ds = new HikariDataSource(config); 

Propriétés:

jdbcUrl=jdbc:mysql://localhost:3306/db?user=user&password=password 
dataSource.prepStmtCacheSize=250 
dataSource.prepStmtCacheSqlLimit=2048 
dataSource.useServerPrepStmts=true 
dataSource.useLocalSessionState=true 
dataSource.useLocalTransactionState=true 
dataSource.rewriteBatchedStatements=true 
dataSource.cacheResultSetMetadata=true 
dataSource.cacheServerConfiguration=true 
dataSource.elideSetAutoCommits=true 
dataSource.maintainTimeStats=false 

JUnit:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (hikari-pool-1)"); 
HikariPoolMXBean poolProxy = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class); 
poolProxy.suspendPool(); 

Exception

java.lang.IllegalStateException: hikari-pool-1 - is not suspendable 

Répondre

2

Par défaut, la piscine ne peut être suspendu.

Vous devez l'activer à la config:

config.setAllowPoolSuspension(true); 
2

Par suspension par défaut de la piscine n'est pas autorisé, vous devez activer explicitement la suspension de la piscine.

Voir aussi la documentation:

allowPoolSuspension
Cette propriété détermine si la piscine peut être suspendue et reprise par JMX. Ceci est utile pour certains scénarios d'automatisation de basculement . Lorsque le pool est suspendu, les appels à getConnection() ne seront pas expirés et seront conservés jusqu'à ce que le pool soit repris. Par défaut: false

En bref, ajouter:

config.setAllowPoolSuspension(true) 
0

Ce sont toutes les grandes réponses. Malheureusement, la suspension du pool est et non un bon moyen de simuler une panne de réseau. Selon que vous utilisez Windows, Linux ou Mac, il existe probablement différentes options. Sur Linux, la meilleure façon de simuler une panne réseau est d'activer/désactiver une règle de pare-feu DROPS DROPS (pas DENY) vers le port MySQL. Il irait quelque chose comme celui-ci (vérifier les références en ligne):

iptables -A INPUT -i lo -p tcp --dport 3306 -j DROP 

et la désactivation (suppression du bloc) serait quelque chose comme ceci:

iptables -D INPUT -i lo -p tcp --dport 3306 -j DROP