go cassandra 示例2

官方示例代碼

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章