Я занимаюсь разработкой API-интерфейса для облачных конечных точек с Java 8 и стандартной средой appengine. Я пытаюсь получить некоторую информацию из Cloud SQL, и сейчас все в порядке, но каждый метод создает новый пул соединений с БД, будучи несколько неэффективным. Как я могу создать только один пул соединений и повторно использовать его в каждом методе?
прямо сейчас я использую метод createConnectionPool () для соединений, но это проблема, так как он вызывается при каждом вызове метода, и мне нужно его повторно использовать.
Я попытался реализовать другой класс, который реализует ServletContextListener, отвечающий за создание пула соединений и сохранение его, чтобы иметь возможность использовать его из класса, который реализует API. Тем не менее, я не знаю, как использовать его из этого последнего класса
Это код для createConnectionPool ()
private DataSource createConnectionPool() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER);
config.setPassword(DB_PASS);
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("useSSL", "false");
config.setMaximumPoolSize(5);
config.setMinimumIdle(5);
config.setConnectionTimeout(10000); // 10 seconds
config.setIdleTimeout(600000); // 10 minutes
config.setMaxLifetime(1800000); // 30 minutes
return new HikariDataSource(config);
}
И это код для методов API
@ApiMethod(name = "pacientes", httpMethod = ApiMethod.HttpMethod.GET)
public Message pacientes(User user, @Named("id") Integer id) throws UnauthorizedException{
if (user == null) {
throw new UnauthorizedException(INVALID_CREDENTIALS);
}
Message resultadoConsulta = new Message();
final String queryPacientes="SELECT nombre FROM paciente WHERE idpaciente=? LIMIT ?" ;
final int LIMIT=1;
DataSource pool = createConnectionPool();
try (Connection conn = pool.getConnection();
PreparedStatement consultaPacientes = conn.prepareStatement(queryPacientes);){
consultaPacientes.setInt(1, id);
consultaPacientes.setInt(2, LIMIT);
try(ResultSet resultadoPacientes = consultaPacientes.executeQuery()){
while (resultadoPacientes.next()) {
String nombre = resultadoPacientes.getString("nombre");
resultadoConsulta.setMessage(nombre);
}
}
}catch (SQLException e) {
throw new RuntimeException(SQL_EXCEPTION, e);
}
return resultadoConsulta;
}
@ApiMethod(name="consulta", httpMethod = ApiMethod.HttpMethod.GET)
public Persona consulta(User user) throws UnauthorizedException{
if (user == null) {
throw new UnauthorizedException(INVALID_CREDENTIALS);
}
Persona alguien= new Persona();
final String consultaSQL="SELECT idpaciente,nombre,telefono FROM paciente LIMIT 1";
DataSource pool = createConnectionPool();
try (Connection conn = pool.getConnection();
PreparedStatement consultaPacientes = conn.prepareStatement(consultaSQL);){
try(ResultSet resultadoPacientes = consultaPacientes.executeQuery()) {
while (resultadoPacientes.next()) {
String idpaciente = resultadoPacientes.getString(1);
String nombre = resultadoPacientes.getString(2);
alguien.setNombre(nombre);
alguien.setApellido(nombre);
alguien.setIdentificacion(idpaciente);
alguien.setTelefono(318);
}
}
}catch (SQLException e) {
throw new RuntimeException(SQL_EXCEPTION, e);
}
return alguien;
}