我遇到了一个有趣的问题,即,即使自第一次尝试以来数据库已被杀死,db.Ping()也不返回错误。
源代码如下:
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
type database struct {
datasource string
conn *sql.DB
}
// Connect creates and initialises a Database struct
func (db *database) Connect(server, user, password, DBPort string) error {
var err error
db.datasource = fmt.Sprintf("%s:%s@/", user, password)
db.conn, err = sql.Open(server, db.datasource)
if err != nil {
log.Fatal(err)
}
err = db.conn.Ping()
if err != nil {
db.conn.Close()
return err
}
log.Println("Waiting for 15 seconds, kill the DB")
<-time.After(15 * time.Second)
err = db.conn.Ping()
if err != nil {
db.conn.Close()
return err
}
log.Println("Second ping successful")
return nil
}
首先,数据库已启动,因此第一个Ping成功。但是,我只是为了进行测试而在其中延迟了一下。在那15秒内,我停止了数据库(sudo service mysql stop
),但是db.Ping()仍然成功。
如果我要执行任何实际的查询(通过db.Query
,db.QueryRow
或db.Exec
),那么SQL包将与断裂的管道(预计)恐慌。
难道我做错了什么?
还:go版本go1.7.1 linux / amd64
提前致谢!
第一次连接后, Ping 实际上不会 对数据库执行ping操作 。这很奇怪,而且是错误的,但这就是它的工作方式(直到Go
1.8
)。如果连接池中有一个尚未超时的现有连接,Ping会简单地从连接池中删除该连接并将其返回给您,而无需费心检查数据库是否仍然存在。
如果数据库驱动程序支持,Kardianos(撰写了上面的链接文档以及Govendor)在1.8中对此进行了修复。但是,在此之前,Ping无法确定数据库是否仍然存在。
问题内容: 我遇到了一个有趣的问题,即db.Ping()不会返回错误,即使自第一次尝试以来数据库已被杀死。 源代码如下: 首先,数据库已启动,因此第一个Ping成功。但是,我只是为了进行测试而在其中延迟了一下。在那15秒内,我停止了数据库(),但是db.Ping()仍然成功。 如果我要执行任何实际的查询(通过,或),那么SQL包将与断裂的管道(预计)恐慌。 难道我做错了什么? 还:go版本go1.
我正在用JPA和Hibernate做一些简单的测试,当我不希望的时候,我碰巧关闭了EntityManager。 这是我的测试主: DB助手: 实体和对应的DAO: 在商店里,当开始交易时,我得到以下信息: 未执行关机方法。为什么实体管理器关闭? 为了完整起见,以下是persistence.xml:
问题内容: 与MySQL的Hibernate连接未关闭。在大约10秒钟内单击10次后,我从MySQL Workbench(在我的开发机中。我是唯一的用户)获得此连接统计信息。MySQL Workbench Server状态 我已经准备好了 C3P0并正在运行(从log4j中检查,与C3P0相关的问题没有问题,似乎正在运行) 一个ServletReqestListener,它检查是否存在打开的会话,
问题内容: 我正在尝试从一个简单的JSON文件填充一个集合,这是学习骨干.js的一部分。但是我无法使它工作。 进行了AJAX调用(已通过FireBug验证),但是该方法返回 。 我究竟做错了什么? 这是我的JSON: 问题答案: 是异步的,如果立即调用,则不会填充您的集合。要解决此问题,您只需将集合 重置 事件(Backbone的 同步 事件> = 1.0)绑定到视图render: 请注意bind
在下面的代码中,线程。activeCount()始终返回2,即使executor中的线程在5秒后终止。 我期望Thread.activeCount()在5秒后返回1。为什么它总是返回2?