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

如何在谷歌云端点框架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贡献1818条经验 获得超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;

    }

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


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


查看完整回答
反对 回复 2022-09-22
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

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