如何在 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”。
我正在使用 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”。