如何在 google 云端点框架 v2 的每个方法中重用连接池?

How to reuse the pool of connections in each method of the google cloud endpoints frameworks v2?

我正在使用 java 8 和 appengine 标准环境开发云端点框架 API。我试图从 Cloud SQL 检索一些信息,现在没问题,但是每种方法都会创建一个新的数据库连接池,效率有点低。我怎样才能只创建一个连接池并在每个方法中重用它?

现在我使用 createConnectionPool() 方法进行连接,但这就是问题所在,因为每次方法调用都会调用它,而我需要的是重用它。

我已经尝试实现另一个实现 ServletContextListener 的 class,负责创建连接池并存储它以便能够从实现 [=24] 的 class 使用它=].但是,我不知道如何从最后一个 class

重用它

这是 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;

    }

要仅创建一次连接池,您可以在 class 中将其设置为静态变量。 为此,您只需将方法“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”方法现在的目的是不破坏可能调用它的 class 其余部分的代码。

现在您可以使用变量 'dataSource' 而不是调用方法“createConnectionPool”。