为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8
【操作系统】:
【CPU】:
【问题描述】*:
服务启动需要初始化数据库表和原始数据,使用事务执行,结果执行到一半提示:无效的语句句柄
按照网上的办法将dm.ini里MAX_SESSION_STATEMENT参数调大了一倍,重启数据库服务,结果还是执行到同一个地方报这个错,这个参数没起作用,到底该咋理解这个句柄
func (h *DBHandler) InitDataBase(db *sql.DB, dbInfo *DBUrlInfo) error {
//初始化表
err := h.initTables(db)
if err != nil {
slog.Error("init tables error:", err)
return err
}
tx, err := db.Begin()
if err != nil {
slog.Error("ready to init index: get db transaction error:", err)
return err
}
defer func() {
if err != nil {
tx.Rollback()
}
}()
//初始化索引
err = h.initIndexes(tx)
if err != nil {
slog.Error("init indexes error:", err)
return err
}
//初始化表数据
err = h.initData(tx)
if err != nil {
slog.Error("init data error:", err)
}
return err
}
func (h *DBHandler) initIndexes(tx *sql.Tx) error {
idxes := []string{
"CREATE INDEX idx_service ON t_service_addr(server);",
"CREATE INDEX idx_servivce_group ON t_service_addr(groupName);",
"CREATE INDEX idx_service_ent ON t_service_entgroup(groupName);",
"CREATE INDEX idx_ent_group_buin ON t_dns_entgroup(buin);",
"CREATE INDEX idx_ent_group_name ON t_dns_entgroup(groupName);",
}
return h.batchCreateIndex(idxes, tx)
}
func (h *DBHandler) batchCreateIndex(sqls []string, tx *sql.Tx) error {
if sqls == nil || len(sqls) == 0 {
return nil
}
for _, sql := range sqls {
_, err := tx.Exec(sql)
if err != nil {
return err
}
}
return nil
}
您好,这边按照您提供的示例片段,写了一个demo,多次运行均能正常执行。demo内容如下:
package main
import (
"database/sql"
"dm"
"fmt"
)
//Db数据库连接池
var db *sql.DB
var err error
var photo dm.DmBlob
func main() {
driverName := "dm"
dataSourceName := "dm://SYSDBA:SYSDBA@localhost:51236"
if db, err = connect(driverName, dataSourceName); err != nil {
fmt.Println(err)
return
}
//初始化表
err = initTables()
if err != nil {
fmt.Println("init tables error:\"%s\"", err)
return
}
//开启事务
tx, err := db.Begin()
if err != nil {
fmt.Println("tx fail")
return
}
defer func() {
if err != nil {
tx.Rollback()
}
}()
//初始化索引
err = initIndexes(tx)
if err != nil {
fmt.Println("init indexes error:\"%s\"", err)
return
}
//初始化表数据
err = initData(tx)
if err != nil {
fmt.Println("init data error:\"%s\"", err)
return
}
//将事务提交
tx.Commit()
}
/* 初始化表 */
func initTables() error {
init_sqls := []string{
"drop table if exists t_service_addr;",
"drop table if exists t_service_entgroup;",
"drop table if exists t_dns_entgroup;",
"create table t_service_addr(c1 int, server varchar, groupName varchar);",
"create table t_service_entgroup(c1 int, groupName varchar);",
"create table t_dns_entgroup(c1 int, groupName varchar, buin varchar);",
}
if init_sqls == nil || len(init_sqls) == 0 {
return nil
}
for _, sql := range init_sqls {
_, err := db.Exec(sql)
if err != nil {
return err
}
}
fmt.Println("init Tables succeed")
return nil
}
/* 初始化索引 */
func initIndexes(tx *sql.Tx) error {
idxes := []string{
"CREATE INDEX idx_service ON t_service_addr(server);",
"CREATE INDEX idx_servivce_group ON t_service_addr(groupName);",
"CREATE INDEX idx_service_ent ON t_service_entgroup(groupName);",
"CREATE INDEX idx_ent_group_buin ON t_dns_entgroup(buin);",
"CREATE INDEX idx_ent_group_name ON t_dns_entgroup(groupName);",
}
return batchCreateIndex(idxes, tx)
}
func batchCreateIndex(sqls []string, tx *sql.Tx) error {
if sqls == nil || len(sqls) == 0 {
return nil
}
for _, sql := range sqls {
_, err := tx.Exec(sql)
if err != nil {
return err
}
}
fmt.Println("init Indexes succeed")
return nil
}
/*初始化表数据 */
func initData(tx *sql.Tx) error {
init_sqls := []string{
"insert into t_service_addr values(1, '192.168.106.6', 'test1'), (2, '192.168.106.7', 'test1'), (3, '192.168.106.8', 'test2');",
"insert into t_service_entgroup values(1, 'test1'), (2, 'test2') ;",
"insert into t_dns_entgroup values(1, 'test1', 'ds1'), (1, 'test1', 'ds2'), (1, 'test2', 'ds3');",
}
if init_sqls == nil || len(init_sqls) == 0 {
return nil
}
for _, sql := range init_sqls {
_, err := tx.Exec(sql)
if err != nil {
return err
}
}
fmt.Println("init data succeed")
return nil
}
/* 创建数据库连接 */
func connect(driverName string, dataSourceName string) (*sql.DB, error) {
var db *sql.DB
var err error
if db, err = sql.Open(driverName, dataSourceName); err != nil {
return nil, err
}
fmt.Printf("connect to \"%s\" succeed.\n", dataSourceName)
return db, nil
}
多次执行结果均如下图:
详细的程序代码和报错信息发出来看看