diff --git a/core/blockchain.go b/core/blockchain.go
index f886ffe4ed7eab8d2d675e6647fb30d87e2b5286..1bda95231ece94f91fa9f43093871f958c008245 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -749,7 +749,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
 				return 0, err
 			}
 			bytes += batch.ValueSize()
-			batch = bc.chainDb.NewBatch()
+			batch.Reset()
 		}
 	}
 	if batch.ValueSize() > 0 {
diff --git a/ethdb/database.go b/ethdb/database.go
index 93755dd7e3049757a4448d65d532e049f071828a..9a7c85d9ef85baef6e1ff937a3fb2ce12214f55a 100644
--- a/ethdb/database.go
+++ b/ethdb/database.go
@@ -299,6 +299,10 @@ func (b *ldbBatch) ValueSize() int {
 	return b.size
 }
 
+func (b *ldbBatch) Reset() {
+	b.b.Reset()
+}
+
 type table struct {
 	db     Database
 	prefix string
@@ -358,3 +362,7 @@ func (tb *tableBatch) Write() error {
 func (tb *tableBatch) ValueSize() int {
 	return tb.batch.ValueSize()
 }
+
+func (tb *tableBatch) Reset() {
+	tb.batch.Reset()
+}
diff --git a/ethdb/interface.go b/ethdb/interface.go
index 99a5b770d5faa02fedda25c58627412559cf823e..5373120030d09f18e327e42fe540a99643f1c103 100644
--- a/ethdb/interface.go
+++ b/ethdb/interface.go
@@ -41,4 +41,6 @@ type Batch interface {
 	Putter
 	ValueSize() int // amount of data in the batch
 	Write() error
+	// Reset resets the batch for reuse
+	Reset()
 }
diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go
index 0dd93a27910c644b79e689cf2b33f0f179ef8f72..8efd7bf8458ecc1af63b7226ff8f347cc60700e3 100644
--- a/ethdb/memory_database.go
+++ b/ethdb/memory_database.go
@@ -123,3 +123,8 @@ func (b *memBatch) Write() error {
 func (b *memBatch) ValueSize() int {
 	return b.size
 }
+
+func (b *memBatch) Reset() {
+	b.writes = b.writes[:0]
+	b.size = 0
+}