我对Vert很陌生。我想使用它的MySQL Pool.
这是我的设置:
MySQLConnectOptions connectOptions = new MySQLConnectOptions()
.setHost(hostname)
.setPort(port)
.setDatabase(dbname)
.setUser(user)
.setPassword(password)
.setCachePreparedStatements(true)
.setPreparedStatementCacheMaxSize(250)
.setPreparedStatementCacheSqlLimit(2048)
.setReconnectAttempts(1)
.setReconnectInterval(10);
PoolOptions poolOptions = new PoolOptions().setMaxSize(5);
pool = MySQLPool.pool(vertx, connectOptions, poolOptions);
pool.connectHandler(handler -> {
Future<Transaction> begin = handler.begin();
if (begin.failed()) {
logger.info("Failed initializing pool");
}
});
当数据库运行时,一切都如预期的那样工作,但是当数据库离线时,我没有得到任何通知,并且顶点继续运行。
我有以下功能:
public static void createTable(final String table) {
pool.query("CREATE TABLE IF NOT EXISTS " + table + "(Id BIGINT PRIMARY KEY, Lat double(8,5), Lon double(8,5));")
.execute(res -> {
if (res.succeeded()) {
logger.info("Created table " + table);
} else {
logger.error("Failed creating table: " + res.cause().getMessage());
}
});
}
在池初始化后立即调用。日志记录器在45秒后输出,表示连接超时。(为什么connectOptions
中指定的是45秒而不是10ms ?)
所以我的问题是:是否有可能检查池是否初始化成功并对结果做出反应?
看来你使用connectHandler
是出于错误的原因。应该调用此方法来设置连接后钩子,而不是验证数据库是否已启动。
当您创建池时,没有任何事情发生,直到您尝试进行查询。因此,在池创建之后,立即调用createTable
:
MySQLConnectOptions connectOptions = new MySQLConnectOptions()
.setHost(hostname)
.setPort(port)
.setDatabase(dbname)
.setUser(user)
.setPassword(password)
.setCachePreparedStatements(true)
.setPreparedStatementCacheMaxSize(250)
.setPreparedStatementCacheSqlLimit(2048)
.setReconnectAttempts(1)
.setReconnectInterval(10);
PoolOptions poolOptions = new PoolOptions().setMaxSize(5);
pool = MySQLPool.pool(vertx, connectOptions, poolOptions);
createTable("my_table");