我已经使用连接池系统建立了一个系统,该系统利用柴油、r2d2和r2d2-diesel作为我的 Web 应用程序的 API 主机。我一直在关注这篇博客文章作为帮助我进行设置的基础。但是,我已经对我的数据库后端切换到 MySQL 进行了修改;我已经添加了必要的柴油功能,并认为这不是问题。
这是我用来设置连接池的代码(与博客文章中的非常相似):
use diesel::prelude::*;
use diesel::mysql::MysqlConnection;
use r2d2::{ GetTimeout, Pool, PooledConnection, Config };
use r2d2_diesel::ConnectionManager;
pub struct DB(PooledConnection<ConnectionManager<MysqlConnection>>);
impl DB {
pub fn conn(&self) -> &MysqlConnection {
&*self.0
}
}
pub fn create_db_pool() -> Pool<ConnectionManager<MysqlConnection>> {
let config = Config::default();
let manager = ConnectionManager::<MysqlConnection>::new(format!("{}", DB_CREDENTIALS));
Pool::new(config, manager).expect("Failed to create pool.")
}
我在设置数据库接口系统的过程中遇到了一个问题。当我通过柴油对数据库进行任何查询时,我收到以下错误:Err(DatabaseError(__Unknown, "Commands out of sync; you can\'t run this command now"))
我已经进行了一些研究,似乎在发送另一个查询之前尚未读取之前的查询时会发生此错误,这使我相信这可能是库错误。我检查了 MySQL 查询日志,除了在连接池中创建连接的查询之外,我没有看到任何查询。
我已经将我的错误减少到一个测试用例。以下响应我在上面粘贴的错误消息:
/// Make sure we can run basic queries on the database using a connection pool
#[test]
fn basic_queries() {
use diesel::connection::SimpleConnection;
let mut pool = create_db_pool();
let mut conn = pool.get().unwrap();
let res = conn.batch_execute("SELECT 1");
println!("{:?}", res);
}
运行如下查询会产生相同的错误消息,但要简化为单个测试用例要困难得多:
let query = diesel::insert(&beatmap).into(schema::beatmaps::dsl::beatmaps);
// println!("{:?}", query);
print_sql!(query);
let conn: &MysqlConnection = &*client.pool.get().expect("Unable to get connection from pool");
let res = query.execute(conn);
我想这是我的一个实现错误,但这可能与我的数据库配置有关吗?我用于开发的数据库正在被超过 3 种语言和多个应用程序积极使用,没有问题,所以我对此表示怀疑。