
首先是登陆腾讯云,登陆之后可以领取新手礼包,如图
进入云产品->数据库->CDB for MYSQL->立即选购,选购最低配的可用礼包抵扣使用一个月,购买完成
主页->右上角产品管理->使用中的数据库,这时我们会看见一个实例,首先我们进入管理页面对实例进行一些基本的设置
实例名可以随意更改,外网地址必须开启,否则我们就不能在自己的项目中和本地访问云数据库。进入账号管理页面修改自己的root密码,然后点击右上角的登录数据库
登陆完成之后如下图
这个和本地客户端 *** 作基本相同,我就不详细阐述了
二、使用一个demo来说明如何 *** 作云mysql数据库
1.在实例上上新建一个为nodejs的数据库,然后新建一个为employee的表,新建四个字段 name sex age email除了年龄为int其它的全部为varchar格式
2.新建一个TimLiu的文件夹,打开cmd,cd TimLiu, 初始化项目npm init ,按照它的提示一步一步的 *** 作即可,安装mysql模块,npm insitall mysql, 这个模块的作用主要是连接mysql数据库。
3.新建一个model.js 文件,
var mysql = require(‘mysql’)var connection = mysql.createConnection({
host:'',
user:'root',
password:'123abc',
database:' nodejs',
port:6445
})
connection.connect()
这里的host为我们在腾讯云上开通的外地址,端口号也是在外网地址里面,注意要把外网地址写分开,用户为默认的管理员用户,密码为我们在云平台上设置的密码,数据库为我们创建的nodejs数据库。
接下来我们对数据库进行增删改查 *** 作
/*** 增加员工
*/function addEmployee(){
var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)'
var employeeInsertSql_Params = ['Tim','男',22,'18818216454@163.com']
connection.query(employeeInsertSql,employeeInsertSql_Params,function(err,result){
if(err) console.log('[INSERT ERR]-',err.message)
console.log(result)
}) }addEmployee()
}
/**
* 更新员工
*/
function insertEmployee(){
var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?"
var employeeUpdateSql_Params = ['Peter',22]
connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){
if(err) console.log('[UPDATE ERR]-',err.message)
console.log(result)
})}
insertEmployee()
/**
*查询员工
*/ function getEmployee(){
var employeeGetSql = "SELECT * FROM employee"
connection.query(employeeGetSql,function(err,result){
if(err) console.log('[SELECT ERR]-',err.message)
console.log(result)
})}
getEmployee()
/***删除员工
*/ function deleteEmployee(){
var employeeDeleteSql = "DELETE employee WHERE name = ?"
var employeeDeleteSql_Params = 'Peter'
connection.query(employeeDeleteSql,employeeDeleteSql_Params,function(err,result){
if(err) console.log('[DELETE ERR]-',err.message)
console.log(result)
})
}deleteEmployee()
这样我们就可以愉快的 *** 作数据库了
如果大家想把项目更模块化 *** 作,可在model下面新建一个employee_two.js,代码如下
var mysql = require('mysql')var connection = mysql.createConnection({host:'',
user:'root',
password:'',
database:'nodejs',
port:})connection.connect()/**
* 增加员工
* @param {String} employee
* @param {Function} callback
*/exports.addEmployee=function(employee,callback){
var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)'
var employeeInsertSql_Params = [employee.name,employee.sex,employee.age,employee.email]
connection.query(employeeInsertSql,employeeInsertSql_Params,callback)}/**
* 更新员工
* @param {String} employee
* @param {Function} callback
*/exports.updateEmployee = function(name,age){
var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?"
var employeeUpdateSql_Params = ['Peter',22]
connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){
if(err) console.log('[UPDATE ERR]-',err.message)
console.log(result)
})}/**
* 查询员工
*
*/exports.getEmployee = function(){
var employeeGetSql = "SELECT * FROM employee"
connection.query(employeeGetSql,callback)}/**
* 删除员工
* @param {String} name
*/exports.deleteEmployee = function(name){
var employeeDeleteSql = "DELETE employee WHERE name = ?"
var employeeDeleteSql_Params = 'Peter'
connection.query(employeeDeleteSql,employeeDeleteSql_Params,callback)
}再在根目录下新建index.js,代码如下var db = require('./model/employee_two')//增加员工var employee = {
name:'lisa',
age:22,
sex:"女",
email:'99533212@qq.com'}db.addEmployee(employee,function(err,result){
if(err) console.log("[INSERT err]-",err.message)
console.log(result)})//删除员工db.deleteEmployee('Peter',function(err,result){
if(err) console.log("[DELETE err]-",err.message)
console.log(result)})//更新员工db.updateEmployee('Tim',23,function(err,result){
if(err) console.log("[UPDATE err]-",err.message)
console.log(result)})//查询员工db.getEmployee(function(err,result){
if(err) console.log("[GET err]-",err.message)
console.log(result)})
一、Can’t connect to MySQL server on ‘localhost’ (10061)翻译:不能连接到 localhost 上的mysql
分析:这说明“localhost”计算机是存在的,但在这台机器上却没提供MySQL服务。
需要启动这台机器上的MySQL服务,如果机子负载太高没空相应请求也会产生这个错误。
解决:既然没有启动那就去启动这台机子的mysql。如果启动不成功,多数是因为你的my.ini配置的有问题。重新配置其即可。
如果觉得mysql负载异常,可以到mysql/bin 的目录下执行mysqladmin -uroot -p123 processlist来查看mysql当前的进程。
二、Unknown MySQL Server Host ‘localhosadst’ (11001)
翻译:未知的MySQL服务器 localhosadst
分析:服务器 localhosasdst 不存在。或者根本无法连接
解决:仔细检查自己论坛下面的 ./config.inc.php 找到$dbhost重新设置为正确的mysql 服务器地址。
三、Access denied for user: ‘roota@localhost’ (Using password: YES)
翻译:用户 roota 访问 localhost 被拒绝(没有允许通过)
分析:造成这个错误一般数据库用户名和密码相对mysql服务器不正确
解决:仔细检查自己论坛下面的 ./config.inc.php 找到$dbuser、$dbpw核实后重新设置保存即可。
四、Access denied for user: ‘red@localhost’ to database ‘newbbs’
翻译:用户 red 在localhost 服务器上没有权限 *** 作数据库newbbs
分析:这个提示和问题三是不同的。那个是在连接数据库的时候就被阻止了,而这个错误是在对数据库进行 *** 作时引起的。比如在select update等等。这个是因为该用户没有 *** 作数据库相应的权力。比如select 这个 *** 作在mysql.user.Select_priv里记录 Y 可以 *** 作N 不可以 *** 作。
解决:如果是自己的独立主机那么更新mysql.user 的相应用户记录,比如这里要更新的用户为red 。或者直接修改 ./config.inc.php 为其配置一个具有对数据库 *** 作权限的用户
或者通过如下的命令来更新授权grant all privileges on dbname.* to ‘user’@’localhost’ identified by ‘password’
提示:更新了mysql库中的记录一定要重启mysql服务器才能使更新生效
FLUSH PRIVILEGES
五、No Database Selected
翻译:没有数据库被选择上
分析:产生的原因有两种
config.inc.php 里面$dbname设置的不对。致使数据库根本不存在,所以在 $db->select_db($dbname)时返回了false
和上面问题四是一样的,数据库用户没有select权限,同样会导致这样的错误。当你发现config.inc.php的设置没有任何问题,但还是提示这个错误,那一定就是这种情况了。
解决:对症下药
打开config.inc.php 找到$dbname核实重新配置并保存
同问题四的解决方法
六、Can’t open file: ‘xxx_forums.MYI’. (errno: 145)
翻译:不能打开xxx_forums.MYI
问题分析:
这种情况是不能打开 cdb_forums.MYI 造成的,引起这种情况可能的原因有:
1、服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。
2、类 unix *** 作系统下直接将数据库文件拷贝移动会因为文件的属组问题而产生这个错误。
解决方法:
1、修复数据表
可以使用下面的两种方式修复数据表:(第一种方法仅适合独立主机用户)
1)使用 myisamchk ,MySQL 自带了专门用户数据表检查和修复的工具 —— myisamchk 。更改当前目录到 MySQL/bin 下面,一般情况下只有在这个下面才能运行 myisamchk 命令。常用的修复命令为:myisamchk -r 数据文件目录/数据表名.MYI;
2)通过 phpMyAdmin 修复, phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击“ *** 作”,在下方的“表维护”中点击“修复表”即可。
注意:以上两种修复方式在执行前一定要备份数据库。
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
简单的说:创建数据库连接是一个很耗时的 *** 作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
不使用数据库连接池
如果不使用数据库连接池,对于每一次SQL *** 作,都要走一遍下面完整的流程:
1.TCP建立连接的三次握手(客户端与 MySQL服务器的连接基于TCP协议)
2.MySQL认证的三次我收
3.真正的SQL执行
4.MySQL的关闭
5.TCP的四次握手关闭
可以看出来,为了执行一条SQL,需要进行大量的初始化与关闭 *** 作
使用数据库连接池
如果使用数据库连接池,那么会 事先申请(初始化)好 相关的数据库连接,然后在之后的SQL *** 作中会复用这些数据库连接, *** 作结束之后数据库也不会断开连接,而是将数据库对象放回到数据库连接池中
资源重用:由于数据库连接得到重用,避免了频繁的创建、释放连接引起的性能开销,在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。 此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。
统一的连接管理,避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接 *** 作中可能出现的资源泄露。
如果说你的服务器CPU是4核i7的,连接池大小应该为((4*2)+1)=9
相关视频推荐
90分钟搞懂数据库连接池技术|linux后台开发
《tcp/ip详解卷一》: 150行代码拉开协议栈实现的篇章
学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
需要C/C++ Linux服务器架构师学习资料加qun 812855908 获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享
源码下载
下载方式:https://github.com/dongyusheng/csdn-code/tree/master/db_pool(Github中下载)
db_pool目录下有两个目录,mysql_pool目录为MySQL连接池代码,redis_pool为redis连接池代码
下面介绍mysql_pool
CDBConn解析
概念: 代表一个数据连接对象实例
相关成员:
m_pDBPool:该数据库连接对象所属的数据库连接池
构造函数: 绑定自己所属于哪个数据库连接池
Init()函数: 创建数据库连接句柄
CDBPool解析
概念:代表一个数据库连接池
相关成员:
Init()函数:常见指定数量的数据库实例句柄,然后添加到m_free_list中,供后面使用
GetDBConn()函数: 用于从空闲队列中返回可以使用的数据库连接句柄
RelDBConn()函数: 程序使用完该数据库句柄之后,将句柄放回到空闲队列中
测试之前,将代码中的数据库地址、端口、账号密码等改为自己的(代码中有好几处)
进入MySQL, 创建mysql_pool_test数据库
进入到mysql_pool目录下, 创建一个build目录并进入 :
然后输入如下的命令进行编译
之后就会在目录下生成如下的可执行文件
输入如下两条命令进行测试: 可以看到不使用数据库连接池,整个 *** 作耗时4秒左右;使用连接池之后,整个 *** 作耗时2秒左右,提升了一倍
源码下载
下面介绍redis_pool
测试
进入到redis_pool目录下, 创建一个build目录并进入 :
然后输入如下的命令进行编译
之后就会在目录下生成如下的可执行文件
输入如下的命令进行测试: 可以看到不使用数据库连接池,整个 *** 作耗时182ms;使用连接池之后,整个 *** 作耗时21ms,提升了很多
进入redis,可以看到我们新建的key:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)