网站首页 > 文章精选 正文
drogon作为为数不多且性能排名靠前的C++WEB应用框架,不体验下怎么能理解其高明之处呢?
做WEB开发,没有ORM,就相当于上战场没有机关枪,别人哒哒哒,而你pia……pia……pia……,这拉一栓打一枪的效率,可低的不是一星半点,那drogon也同样提供了ORM的功能,可以连接的数据库有mysql、postgresql、sqlite3。
我们看下使用conan包管理器怎么构建drogon+postgresql,同时官方也给了文档Drogon Framework - Documentation。
1.在工程根目录下添加conanfile.txt,内容如下:
[requires]
drogon/1.9.10
[options]
drogon/*:with_postgres=True
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout
注意:这里with_postgres需设置为True,drogon才能开启并连接postgresql。
2.在CMakeLists.txt里添加Drogon依赖:
# 添加 Drogon 依赖
find_package(Drogon)
set(SOURCES
controllers/TestCtrl.cc
)
# 创建可执行文件
add_executable(${PROJECT_NAME} main.cpp ${SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE controllers)
target_link_libraries(${PROJECT_NAME}
PRIVATE
Drogon::Drogon
)
注意:这里controllers时默认名称,controller都默认写到这个目录,方便drogon配置读取,省的在单独指定。
3.创建config.json,添加配置,可以到drogon例子里拷贝,重点是listeners、app、db_clients:
{
"listeners": [
{
"address": "127.0.0.1",
"port": 8848,
"https": false
}
],
"app": {
"number_of_threads": 1,
"enable_session": false,
"session_timeout": 0,
"session_cookie_key": "JSESSIONID",
"session_max_age": -1,
"document_root": "./",
"home_page": "index.html",
"use_implicit_page": true,
"implicit_page": "index.html",
"upload_path": "uploads",
"file_types": [
"gif",
"png",
"jpg",
"js",
"css",
"html",
"ico",
"swf",
"xap",
"apk",
"cur",
"xml"
],
"locations": [
{
"default_content_type": "text/plain",
"alias": "",
"is_case_sensitive": false,
"allow_all": true,
"is_recursive": true,
"filters": []
}
],
"max_connections": 100000,
"max_connections_per_ip": 0,
"load_dynamic_views": false,
"dynamic_views_path": [
"./views"
],
"dynamic_views_output_path": "",
"enable_unicode_escaping_in_json": true,
"float_precision_in_json": {
"precision": 0,
"precision_type": "significant"
},
"log": {
"logfile_base_name": "",
"log_size_limit": 100000000,
"log_level": "DEBUG"
},
"run_as_daemon": false,
"handle_sig_term": true,
"relaunch_on_error": false,
"use_sendfile": true,
"use_gzip": true,
"use_brotli": false,
"static_files_cache_time": 5,
"simple_controllers_map": [
],
"idle_connection_timeout": 60,
"server_header_field": "",
"enable_server_header": true,
"enable_date_header": true,
"keepalive_requests": 0,
"pipelining_requests": 0,
"gzip_static": true,
"br_static": true,
"client_max_body_size": "1M",
"client_max_memory_body_size": "64K",
"client_max_websocket_message_size": "128K",
"reuse_port": false
},
"db_clients":[
{
"name":"test",
"rdbms": "postgresql",
"host": "127.0.0.1",
"port": 5432,
"dbname": "postgres",
"user": "postgres",
"passwd": "123456",
"is_fast": false,
"connection_number":1,
"filename": ""
}
]
}
注意:db_clients的name最好设置一下,这里key是不能变的,value随意。
4.测试代码:
#pragma once
#include <drogon/HttpSimpleController.h>
using namespace drogon;
class JsonCtrl : public drogon::HttpSimpleController
{
public:
void asyncHandleHttpRequest(
const HttpRequestPtr &req,
std::function &&callback) override;
PATH_LIST_BEGIN
// list path definitions here;
PATH_ADD("/json", Get);
PATH_LIST_END
};
#include "TestCtrl.h"
void JsonCtrl::asyncHandleHttpRequest(
const HttpRequestPtr &,
std::function &&callback)
{
Json::Value ret;
ret["message"] = "Hello, World!";
auto clientPtr = drogon::app().getDbClient("test");
clientPtr->execSqlAsync("select * from users where username=$1",
[](const drogon::orm::Result &result) {
std::cout << result.size() << " rows selected!" << std::endl;
int i = 0;
for (auto row : result)
{
std::cout << i++ << ": user name is " << row["username"].as() << std::endl;
}
},
[](const drogon::orm::DrogonDbException &e) {
std::cerr << "error:" << e.base().what() << std::endl;
},
"test");
auto resp = HttpResponse::newHttpJsonResponse(std::move(ret));
callback(resp);
}
#include
#include <drogon/drogon.h>
int main(int, char **)
{
drogon::app().loadConfigFile("config.json");
drogon::app().run();
return 0;
}
运行结果:
这样drogon+postgresql就大功告成了,
至于mysql应该是使用一致的方法就行:
1.conanfile.txt文件添加:drogon/*:with_mysql=True。
2.db_clients设置rdbms为mysql,其余详见在线文档Drogon Framework - Documentation。
运行后报错如下:
加入root@%后,报错为:
经过多方尝试未能正常解决,所以果断放弃,哪位大佬有成功的方案,还请麻烦不吝赐教,实际场景用mysql还是用postgresql对于体验来说,区别不大。
同样的配置、同样的代码在Linux上运行无异常。
总的来说,约定俗称的配置,现代的编码风格,齐全的框架工具,优异的性能,都很符合现代程序员编写WEB服务的需求,值得一试。
猜你喜欢
- 2025-08-02 C++开发者都应该使用的十个C++11特性(上)
- 2025-08-02 如何实现自己的C++ unique_ptr?
- 2025-08-02 刚学会C++的小白用这个开源框架,做个 RPC 服务要多久?
- 2025-08-02 C++11+ 泛型编程(模板)
- 2025-08-02 abelkhan中的rpc框架
- 2025-08-02 C++设计模式:用代码演绎武侠世界的绝世神功
- 2025-08-02 视频分析与对象跟踪-扩展模块的单目标和多目标跟踪
- 2025-08-02 ROS2开发实践:ROS核心(节点、话题、服务、DDS通信协议等)
- 2025-08-02 C++语言程序员编程必收藏的20个经典实战案例(附完整源码)
- 2025-08-02 C# 控制电脑睡眠,休眠,关机以及唤醒
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)