为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2022-09-22 20:06:46

我正在开发一个具有java 8和应用程序标准环境的云端点框架API。我试图从Cloud SQL中检索一些信息,现在还可以,但是每种方法都会创建一个新的数据库连接池,这有点低效。如何只创建一个连接池并在每种方法中重用它?


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


我试图实现另一个实现 ServletContextListener 的类,负责创建连接池并存储它,以便能够从实现 API 的类中使用它。但是,我不知道如何从最后一堂课中重用它


这是创建连接池() 的代码



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()){



查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1481条经验 获得超3个赞

若要只创建一次连接池,可以使其成为类中的静态变量。为此,您只需将方法“创建连接池”的代码替换为以下块:


    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;

    }

请记住,方法“创建连接池”现在的目的是不破坏可能被调用的类的其余部分的代码。


现在,您可以使用变量“数据源”,而不是调用方法“创建连接池”。


查看完整回答
反对 回复 6天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信