cloud-sql/mysql/Startup.cs (81 lines of code) (raw):

/* * Copyright (c) 2019 Google LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using MySql.Data.MySqlClient; using Polly; using System; using System.Data.Common; namespace CloudSql { public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } // This method gets called by the runtime. Use this method to add // services to the container. // For more information on how to configure your application, visit // http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddSingleton(sp => StartupExtensions.GetMySqlConnectionString()); services.AddMvc(options => { options.Filters.Add(typeof(DbExceptionFilterAttribute)); }); services.AddMvc(option => option.EnableEndpointRouting = false); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // Configure error reporting service. app.UseExceptionHandler("/Home/Error"); } app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } static class StartupExtensions { public static void OpenWithRetry(this DbConnection connection) => // [START cloud_sql_mysql_dotnet_ado_backoff] Policy .Handle<MySqlException>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5) }) .Execute(() => connection.Open()); // [END cloud_sql_mysql_dotnet_ado_backoff] public static void InitializeDatabase() { var connectionString = GetMySqlConnectionString(); using(DbConnection connection = new MySqlConnection(connectionString.ConnectionString)) { connection.OpenWithRetry(); using (var createTableCommand = connection.CreateCommand()) { createTableCommand.CommandText = @" CREATE TABLE IF NOT EXISTS votes( vote_id SERIAL NOT NULL, time_cast timestamp NOT NULL, candidate CHAR(6) NOT NULL, PRIMARY KEY (vote_id) )"; createTableCommand.ExecuteNonQuery(); } } } public static MySqlConnectionStringBuilder GetMySqlConnectionString() { MySqlConnectionStringBuilder connectionString; if (Environment.GetEnvironmentVariable("INSTANCE_HOST") != null) { connectionString = MySqlTcp.NewMysqlTCPConnectionString(); } else { connectionString = MySqlUnix.NewMysqlUnixSocketConnectionString(); } // The values set here are for demonstration purposes only. You // should set these values to what works best for your application. // [START cloud_sql_mysql_dotnet_ado_limit] // MaximumPoolSize sets maximum number of connections allowed in the pool. connectionString.MaximumPoolSize = 5; // MinimumPoolSize sets the minimum number of connections in the pool. connectionString.MinimumPoolSize = 0; // [END cloud_sql_mysql_dotnet_ado_limit] // [START cloud_sql_mysql_dotnet_ado_timeout] // ConnectionTimeout sets the time to wait (in seconds) while // trying to establish a connection before terminating the attempt. connectionString.ConnectionTimeout = 15; // [END cloud_sql_mysql_dotnet_ado_timeout] // [START cloud_sql_mysql_dotnet_ado_lifetime] // ConnectionLifeTime sets the lifetime of a pooled connection // (in seconds) that a connection lives before it is destroyed // and recreated. Connections that are returned to the pool are // destroyed if it's been more than the number of seconds // specified by ConnectionLifeTime since the connection was // created. The default value is zero (0) which means the // connection always returns to pool. connectionString.ConnectionLifeTime = 1800; // 30 minutes // [END cloud_sql_mysql_dotnet_ado_lifetime] return connectionString; } } }