Мы пытаемся использовать GO для создания веб-приложения, которое подключается к ProxySQL, которое, в свою очередь, подключается к различным серверам баз данных MySQL на основе правил запросов MySQL, установленных в ProxySQL.
Мы можем подключитьсяв ProxySQL через командную строку в linux и все работает как положено:
use database1;
select id from users where user_id=1;
use database2;
select id from posts where user_id=1;
Вышеуказанные базы данных расположены на физически разных серверах. Правила в ProxySQL знают, как их маршрутизировать.
При подключении к ProxySQL правила работают нормально, и мы подключены к правильным серверам баз данных, и запросы обрабатываются, как и ожидалось.
Когда мы пытаемсяТо же самое с GO и транзакциями, мы не можем переключить базы данных, поскольку они возвращают, что база данных не существует.
База данных существует на внутренних серверах, на которые ProxySQL будет направлять трафик.
По какой-то причине он работает в командной строке, но не в GO
Мы можем заставить его работать, если мы подключаемся с GO и указываем базу данных на соединение, затем отключаемся и повторно подключаемся с новым подключением к базе данных.
Мы пытаемся использовать пул соединений, чтобы не тратить время на открытие и закрытие соединений.
//open the connection to ProxySQL
db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/")
//The above only allows us to stay on the default database for the user
//in order to access each of the databases we would need to open a
//connection to database1 then open another connection to database2
//which defeats the whole purpose of connection pooling.
db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/database1")
... do something...
db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/database2")
... do something ...
//code below is an example of what is not working but works from
//command line in linux. Results are not processed below because we
//cannot get past the first error of no database
tx, err := db.Begin()
res, err := tx.Exec("use database1")
res, err = tx.Exec("select id from users where user_id=1;")
res, err = tx.Exec("use database2")
res, err = tx.Exec("select id from posts where user_id=1;")
tx.Commit()
ProxySQL знает, как правильно маршрутизировать, но мы не можемполучить правильную работу функций в GOLANG