我有一个 .Net Core (C#) 应用程序,它通过 websocket 接受用户请求,然后创建与 PostgreSQL 数据库的连接以操作/处理数据。
当用户向后端发出新请求时,调用的端点函数会创建一个新的 SQL 连接并运行查询:
// Endpoint available via Websocket
public async Task someRequest(someClass someArg)
{
/* Create a new SQL connection for this user's request */
using var conn = new NpgsqlConnection(connstr.getConnStr());
conn.Open();
/* Call functions and pass this SQL connection for any queries to process this user request */
somefunction(conn, someArg);
anotherFunction(conn, someArg);
/* Request processing is done */
/* conn is closed automatically by the "using" statement above */
} …Run Code Online (Sandbox Code Playgroud) 基本介绍:
连接字符串: Host=IP;Port=somePort;Username=someUser;Password=somePass;Database=someDb;Maximum Pool Size=100
我的 Web 应用程序有几十个可通过 WS 和 HTTP 使用的端点。这些端点中的每一个都打开一个新的 NPGSQL 连接(都使用与上面相同的连接字符串),处理数据,然后通过using语句关闭。
问题: 当应用程序重新启动以进行更新时,通常有 2-3,000 个用户全部重新连接。这通常会导致有关连接池已满和新连接因已经有太多客户端而被拒绝的错误。但是,一旦它最终可以上线,它通常在任何给定时间只使用 5-10 个连接。
问题: 下面的逻辑是使用连接池的正确方法吗?每个端点都使用相同的连接字符串创建一个新的 NPGSQL 连接,指定连接池为 100?
似乎连接池经常会达到 100,但这些连接中有大约 80/100 在数据库查看器中显示为空闲,新连接请求由于池溢出而被拒绝。
更好的选择? 我也可以尝试通过慢慢地允许新用户重新连接来强制更“优雅”的启动,但我不确定与每个端点创建新连接的逻辑是否正确。
// DB Connection String - Used for all NPGSQL connections
const string connectionStr "Host=IP;Port=somePort;Username=someUser;Password=somePass;Database=someDb;Maximum Pool Size=100";
// Endpoint 1 available via Websocket
public async Task someRequest(someClass someArg)
{
/* Create a new SQL connection for this user's request using the same global connections string */
using var …Run Code Online (Sandbox Code Playgroud) 我目前正在 Ubuntu Apache Web 服务器上使用 SignalR 运行 .Net Core 应用程序。此 .Net Core 应用程序可通过 example.com/api 路径访问。
我还在网络服务器上运行了一个 Vue JS 应用程序。当我尝试建立与 SignalR 应用程序的 websocket 连接时,出现以下错误:
与“wss://example.com/api/mainHub?id=V3XZrhdsQDTTMIZvQ-8cbQ”的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:200
错误:无法启动传输“WebSockets”:null
.Net Core 应用程序的 Apache 配置如下:
#Main/Desired Path - https://example.com
<VirtualHost *:443>
DocumentRoot /var/www/example.com/dist/spa
ServerName example.com
#SSL Certs
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
SSLCertificateFile /etc/apache2/ssl/example.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/example.ca-bundle
#Upgrade Websockets
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://localhost:5000/$1 [P]
#Other specific directories
ProxyPreserveHost On
ProxyPass …Run Code Online (Sandbox Code Playgroud) apache2 signalr kestrel kestrel-http-server asp.net-core-signalr
我正在运行一个C#函数来创建一个以用户输入命名的数据库.我想防止SQL注入.通常,我会使用参数,但参数仅适用于数据操作而不适用于数据创建.代码是:
using (var conn = new MySqlConnection(connStr))
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = "CREATE DATABASE IF NOT EXISTS @name";
comm.Parameters.AddWithValue("@name", id);
comm.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
由于参数不能用于创建数据库,因此对于防止注入进行消毒输入的最佳方法是什么?
谢谢!