Best practice for instantiating Prisma Client with Next.js
Problem
Many users have come across this warning while working with Next.js in development:
warn(prisma-client) There are already 10 instances of Prisma Client actively running.
There's a related discussion and issue for the same.
In development, the command next dev
clears Node.js cache on run. This in turn initializes a new PrismaClient
instance each time due to hot reloading that creates a connection to the database. This can quickly exhaust the database connections as each PrismaClient
instance holds its own connection pool.
Solution
The solution in this case is to instantiate a single instance PrismaClient
and save it on the globalThis
object. Then we keep a check to only instantiate PrismaClient
if it's not on the globalThis
object otherwise use the same instance again if already present to prevent instantiating extra PrismaClient
instances.
import { PrismaClient } from '@prisma/client'
const prismaClientSingleton = () => {
return new PrismaClient()
}
declare global {
var prismaGlobal: undefined | ReturnType<typeof prismaClientSingleton>
}
const prisma = globalThis.prismaGlobal ?? prismaClientSingleton()
export default prisma
if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma
You can extend Prisma Client using a Prisma Client extension by appending the $extends
client method when instantiating Prisma Client as follows:
import { PrismaClient } from '@prisma/client'
const prismaClientSingleton = () => {
return new PrismaClient().$extends({
result: {
user: {
fullName: {
needs: { firstName: true, lastName: true },
compute(user) {
return `${user.firstName} ${user.lastName}`
},
},
},
},
})
}
After creating this file, you can now import the extended PrismaClient
instance anywhere in your Next.js pages
as follows:
// e.g. in `pages/index.tsx`
import prisma from './db'
export const getServerSideProps = async () => {
const posts = await prisma.post.findMany()
return { props: { posts } }
}