Как повторно использовать пул соединений в каждом методе фреймворков конечных точек облака Google v2? - PullRequest
0 голосов
/ 06 апреля 2019

Я занимаюсь разработкой 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;

    }

1 Ответ

0 голосов
/ 08 апреля 2019

Чтобы создать пул соединений только один раз, вы можете сделать его статической переменной в своем классе. Для этого вам просто нужно заменить код для метода createConnectionPool следующим блоком:

    private static DataSource dataSource;

    static {

        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

        dataSource = new HikariDataSource(config);
    }

    private DataSource createConnectionPool() {
        return dataSource;
    }

Имейте в виду, что метод createConnectionPool теперь имеет целью не нарушать код остальной части класса, где он может быть вызван.

Теперь вы можете использовать переменную dataSource вместо вызова метода createConnectionPool.

...