cloud-sql/sql-server/Startup.cs (73 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.Data.SqlClient; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; 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.GetSqlServerConnectionString()); 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_sqlserver_dotnet_ado_backoff] Policy .Handle<SqlException>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5) }) .Execute(() => connection.Open()); // [END cloud_sql_sqlserver_dotnet_ado_backoff] public static void InitializeDatabase() { var connectionString = GetSqlServerConnectionString(); using(DbConnection connection = new SqlConnection(connectionString.ConnectionString)) { connection.OpenWithRetry(); using (var createTableCommand = connection.CreateCommand()) { // Create the 'votes' table if it does not already exist. createTableCommand.CommandText = @" IF OBJECT_ID(N'dbo.votes', N'U') IS NULL BEGIN CREATE TABLE dbo.votes( vote_id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, time_cast datetime NOT NULL, candidate CHAR(6) NOT NULL) END"; createTableCommand.ExecuteNonQuery(); } } } public static SqlConnectionStringBuilder GetSqlServerConnectionString() { SqlConnectionStringBuilder connectionString; connectionString = SqlServerTcp.NewSqlServerTCPConnectionString(); // The values set here are for demonstration purposes only. You // should set these values to what works best for your application. // [START cloud_sql_sqlserver_dotnet_ado_limit] // MaximumPoolSize sets maximum number of connections allowed in the pool. connectionString.MaxPoolSize = 5; // MinimumPoolSize sets the minimum number of connections in the pool. connectionString.MinPoolSize = 0; // [END cloud_sql_sqlserver_dotnet_ado_limit] // [START cloud_sql_sqlserver_dotnet_ado_timeout] // ConnectionTimeout sets the time to wait (in seconds) while // trying to establish a connection before terminating the attempt. connectionString.ConnectTimeout = 15; // [END cloud_sql_sqlserver_dotnet_ado_timeout] // [START cloud_sql_sqlserver_dotnet_ado_lifetime] // ADO.NET connection pooler removes a connection // from the pool after it's been idle for approximately // 4-8 minutes, or if the pooler detects that the // connection with the server no longer exists. // [END cloud_sql_sqlserver_dotnet_ado_lifetime] connectionString.TrustServerCertificate = true; return connectionString; } } }