我正在使用PHP的PDO层进行项目中的数据访问,我一直在阅读它并发现它对持久数据库连接有很好的内在支持.我想知道何时/是否应该使用它们.我会在CRUD沉重的应用程序中看到性能优势吗?是否存在需要考虑的缺点,可能与安全性有关?
如果对你很重要,我正在使用MySQL 5.x.
我在我的PHP应用程序中使用PDO.它连接到同一服务器上的MySQL服务器:
$db = new PDO(mysql:host=localhost;dbname=test, $username, $password);
Run Code Online (Sandbox Code Playgroud)
我创建了两个具有相同输出的页面(只是普通html中的一些虚拟数据),其中一个包含创建PDO的调用.如果我打开不使用连接的页面,响应速度会提高0.5到1秒.
使用PDO时,持久连接管理背后的规则/逻辑是什么?
网络服务器
DB服务器
非持久连接
<?php
// Open a new connection
// Session created in Oracle
$dbh = new PDO('DSN', 'webuser', 'password');
// webuser is active in v$session with a SID=1
$dbh = NULL;
// webuser removed from v$session
// Manually calling $dbh = NULL; will remove the session from v$session
// OR
// Wait for script EOL so a …Run Code Online (Sandbox Code Playgroud) 使用PDO建立与数据库的连接时,是否应每次使用PDO属性PDO :: ATTR_PERSISTENT?它表示这会为该用户创建一个持久连接,并且每次请求数据库连接时都会获取相同的连接而不是重新建立新连接.为什么这不是默认值?有没有理由不使用它?
假设用户在单个主机上托管了两个数据库,我需要连接到它们,以便我可以随时使用任何表而无需多次添加连接代码.
我已经在CodeIgniter中实现了这一点,在database.php文件中添加了两个数据库的授权详细信息,并$this->load->database('dbname');在脚本中加载了所需的数据库.
现在,对于核心PHP,我们可以这样做:
mysql_connect ('host','user','password','port','dbname'); // connection with one database.
Run Code Online (Sandbox Code Playgroud)
它与我的第一个数据库连接.
现在,我想连接第二个数据库:
1)我没有关闭上面的连接并与第二个连接
mysql_connect ('host','user','password','port','dbname1');.
Run Code Online (Sandbox Code Playgroud)
2)这样做是不好的做法?它会消耗更多的物体吗?我们是否应该被要求先关闭第一个?
我的Laravel 5.7网站遇到了一些我认为彼此相关的问题(但在不同时间发生):
PDO::prepare(): MySQL server has gone awayE_WARNING: Error while sending STMT_PREPARE packet. PID=10PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry (我的数据库似乎经常尝试在同一秒内写两次相同的记录.我一直无法弄清楚为什么或如何重现它;它似乎与用户行为无关.)几个月来,我一直看到这些可怕的日志消息,而且我完全无法重现这些错误(并且无法诊断和解决它们).
我还没有发现任何实际症状或听到用户的任何抱怨,但错误消息似乎并非易事,所以我真的想了解并解决根本原因.
我已经尝试更改我的MySQL配置使用max_allowed_packet=300M(而不是默认的4M)但在我有超过几个访问者访问我的网站的日子里仍然经常得到这些例外.
由于这个建议,我还设置了(从5M和10M改为)以下内容:
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
Run Code Online (Sandbox Code Playgroud)
作为进一步背景:
artisan queue:work --sleep=3 --tries=3 --daemon)的队列工作者. mysqlslap查询(虽然我完全是新手)并且即使在模拟数百个并发客户端时也没有发现任何缓慢的问题.SHOW VARIABLES;和SHOW GLOBAL STATUS; 在这里.我my.cnf是:
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过启用持久数据库连接来提高volkszaehler.org实现的性能.攻击包含了Doctrine的Connection类PDO::ATTR_PERSISTENT => true,我得到了PDO错误General error: PDO::ATTR_STATEMENT_CLASS cannot be used with persistent PDO instances"
有没有什么办法解决这一问题?
我的localhost渲染页面很慢.一切甚至简单的html渲染大约需要2-5秒.我研究了它并通过替换修复它:
new \PDO(... ':host=localhost' ...);
Run Code Online (Sandbox Code Playgroud)
至
new \PDO(... ':host=127.0.0.1' ...);
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释或给我一个链接,以了解为什么localhost正在放慢速度以及如何将其更改为IP使其变得非常快.现在它甚至可以在不到一秒的时间内渲染出复杂的查询,大约需要5-10秒.
将localhost替换为IP还有任何安全问题吗?我的意思是,如果我现场托管我的项目,我将localhost替换为主机的IP,它会对任何类型的安全性产生影响吗?
非常感谢
所以我有一个Java进程无限期地作为TCP服务器运行(从另一个进程接收消息,并具有onMsg处理程序).
我想用Java程序中的消息做的事情之一是使用与postgres的数据库连接将其写入磁盘.现在,我有一个静态连接对象,我每次收到消息时都会调用它.我不会关闭并重新打开每条消息的连接.
我对Java仍然有点新意,我想知道1)使用一个无限期打开的连接对象是否存在任何陷阱或危险; 2)从不关闭连接是否有性能优势,而不是重新打开/关闭每个连接对象我想打数据库的时候?
谢谢您的帮助!
pdo ×7
php ×7
mysql ×2
apache ×1
database ×1
doctrine-orm ×1
java ×1
jdbc ×1
laradock ×1
laravel ×1
laravel-5 ×1
localhost ×1
oracle ×1
oracle10g ×1
performance ×1
persistence ×1
postgresql ×1
sql ×1