官方示例代碼
https://my.oschina.net/u/3896587/blog/4943855
建立連接,參數配置(說明:下文中golangConfig.InitConfigMap爲項目啓動時加載的配置文件,讀取成全局的Map)
package cassandra
import (
"fmt"
"github.com/gocql/gocql"
"time"
"src/golangConfig"
)
var (
// connect to the cluster
CassandraSession *gocql.Session
cluster *gocql.ClusterConfig
CassandraSessionBatch *gocql.Batch
clusterCreateSessionErr error
CassandraInsertCql string
)
func CassandraConnectInit() {
CassandraInsertCql = "INSERT INTO " + golangConfig.InitConfigMap["cassandraTable"].(string) + " (srcIp, .....,uuid) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) "
cluster = gocql.NewCluster()
cluster.Keyspace = golangConfig.InitConfigMap["cassandraKeyspace"].(string)
hosts := []string{golangConfig.InitConfigMap["cassandraServiceUrl"].(string)}
cluster.Hosts = hosts
cluster.ConnectTimeout = golangConfig.InitConfigMap["cassandraConnectTimeout"].(time.Duration)
cluster.Timeout = golangConfig.InitConfigMap["cassandraTimeout"].(time.Duration)
cluster.Consistency = gocql.Quorum
cluster.NumConns = golangConfig.InitConfigMap["cassandraNumConns"].(int)
cluster.Consistency = gocql.One
CassandraSession, clusterCreateSessionErr = cluster.CreateSession()
if clusterCreateSessionErr != nil {
panic(clusterCreateSessionErr)
}
}
func CassandraSessionBatchInit() *gocql.Batch {
CassandraSessionBatch = CassandraSession.NewBatch(gocql.UnloggedBatch)
return CassandraSessionBatch
}
func InsertCassandraMany(batch1 *gocql.Batch) {
if err := CassandraSession.ExecuteBatch(batch1); err != nil {
fmt.Println("execute batch:", err)
}
}
連接初始化,在Main方法中調用
dbwrite.CassandraInit()
以下代碼爲批量插入數據庫(到達預設長度後,立即持久化。當最後長度不滿足後,到達一定時間插入數據庫),通過通道eventQueue1操作數據
package dbwrite
import (
"fmt"
"github.com/gocql/gocql"
uuid "github.com/satori/go.uuid"
"time"
"src/golangConfig"
"src/cassandra"
)
type CassandraTable struct {
cassandraInsertCql string
srcIp string
.....表字段
func NewCassandraTable(cassandraInsertCql string, srcIp string, .....表字段) *CassandraTable {
var cassandraTable = new(CassandraTable)
cassandraTable.cassandraInsertCql = cassandraInsertCql
cassandraTable.srcIp = srcIp
.....表字段
return cassandraTable
}
var (
eventQueue1 chan *CassandraTable
BatchWriteSize1 int
Workers1 int
lingerTime1 time.Duration
batchProcessor1 = func(batch *gocql.Batch) error {
yxCassandra.InsertCassandraMany(batch)
return nil
}
errHandler1 = func(err error, batch *gocql.Batch) {
fmt.Println("some error happens")
}
)
func setWorkers1() {
for i := 0; i < Workers1; i++ {
go func() {
batch := cassandra.CassandraSessionBatchInit()
lingerTimer := time.NewTimer(5 * time.Second)
if !lingerTimer.Stop() {
<-lingerTimer.C
}
defer lingerTimer.Stop()
for {
select {
case cassandraTable := <-eventQueue1:
ul, _ := uuid.NewV4()
batch.Query(cassandraTable.cassandraInsertCql, cassandraTable.srcIp, .....表字段, ul.String())
if batch.Size() != BatchWriteSize1 {
if batch.Size() == 1 {
lingerTimer.Reset(lingerTime1)
}
break
}
if err := batchProcessor1(batch); err != nil {
errHandler1(err, batch)
}
if !lingerTimer.Stop() {
<-lingerTimer.C
}
batch = cassandra.CassandraSessionBatchInit()
case <-lingerTimer.C:
if err := batchProcessor1(batch); err != nil {
errHandler1(err, batch)
}
batch = cassandra.CassandraSessionBatchInit()
}
}
}()
}
}
func PushCassandraElement(e *CassandraTable) {
eventQueue1 <- e
}
func CassandraInit() {
eventQueue1 = make(chan *CassandraTable, golangConfig.InitConfigMap["cassandraEventQueueCache"].(int))
BatchWriteSize1 = golangConfig.InitConfigMap["cassandraBatchWriteSize"].(int)
Workers1 = golangConfig.InitConfigMap["cassandraWorkers"].(int)
lingerTime1 = golangConfig.InitConfigMap["cassandraLingerTime"].(time.Duration)
cassandra.CassandraConnectInit()
setWorkers1()
}
向通道存入值
cassandraTable:=dbwrite.NewCassandraTable(yxCassandra.CassandraInsertCql, packetInfo.srcIp....)
dbwrite.PushCassandraElement(cassandraTable)