有一個基于 SpringBoot 的應用程式運行在服務器上,它定期在關系資料庫中插入/更新記錄。
資料庫連接是這樣設定的:
import org.springframework.context.annotation.Bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import javax.sql.DataSource;
[...]
@Configuration
@EnableConfigurationProperties
public class DbConfigClass {
[...]
@Bean(name = "myDataSource")
@ConfigurationProperties(prefix = "com.mycompany.somedatabase")
public DataSource dsSomeDataSource() {
return DataSourceBuilder.create().build();
}
[...]
}
有時連接會以不規則、不可預測的時間間隔中斷。然后,我收到這樣的錯誤:
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available,
request timed out after 30001ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:694)
我需要確保我的應用程式可以處理此類中斷。為此,我需要能夠在本地重現此行為。
我該怎么做?
我查看了ToxyProxy,它似乎可以滿足我的需求。
但是,我想知道我是否可以更輕松地模擬這些條件,例如通過使用 Mockito.spy 修改資料源,使其有時會拋出上述例外。
uj5u.com熱心網友回復:
- Mockito 或其他替代方案,因此您必須手動拋出例外
- 使用 docker(testcontainers 依賴),你可以停止它
- https://www.testcontainers.org/(手動配置)
- https://github.com/Playtika/testcontainers-spring-boot(它是相對自動的,可能不是你現在需要的)
uj5u.com熱心網友回復:
找到了一個簡單且看似足夠好的解決方案:
首先,我創建了一個類,它的getConnection方法在每第二次呼叫時都會拋出一個例外:
public class ShakyDataSource implements DataSource {
private final DataSource ds;
private AtomicLong getConnectionCallsCount = new AtomicLong(1);
public ShakyDataSource(final DataSource ds) {
this.ds = ds;
}
@Override
public Connection getConnection() throws SQLException {
final long newGetConnectionCallCount = getConnectionCallsCount.incrementAndGet();
if ((newGetConnectionCallCount % 2) == 0) {
throw new SQLException("Simulated connection failure");
}
else {
return ds.getConnection();
}
}
// All other methods of DataSource call corresponding methods of ds
}
然后我修改了這樣的配置:
import org.springframework.context.annotation.Bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import javax.sql.DataSource;
[...]
@Configuration
@EnableConfigurationProperties
public class DbConfigClass {
[...]
@Bean(name = "myDataSource")
@ConfigurationProperties(prefix = "com.mycompany.somedatabase")
public DataSource dsSomeDataSource() {
if (SIMULATE_SHAKY_CONNECTION) {
LOGGER.error("Don't do this in production!");
return new ShakyDataSource(DataSourceBuilder.create().build());
}
return DataSourceBuilder.create().build();
}
[...]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404704.html
標籤:
