Scala, Slick :too many clients already












0














ive come across this problem :



Caused by: org.postgresql.util.PSQLException: FATAL: sorry, too many clients already


The app works, but i can only make like 3 or 4 requests and then im getting this error, so whats happening (im guessing) is im creating new connections per request and id like to keep one connection per app lifecycle, any idea how to modify the code to do so?



Tried injecting UsersDao to my controller instead of using it as an object but that changes nothing



Im really new to scala so any help is appreciated



Dao



import config.DatabaseConfig
import domain.{User, UsersTable}
import slick.jdbc.PostgresProfile.api._
import slick.sql.SqlAction

import scala.concurrent.Future
trait BaseDao extends DatabaseConfig {

val usersTable = TableQuery[UsersTable]


protected implicit def executeFromDb[A](action: SqlAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
println(db)
db.run(action)
}

}
object UsersDao extends BaseDao {

def findAll: Future[Seq[User]] = usersTable.result

def create(user: User): Future[Long] = usersTable.returning(usersTable.map(_.id)) += user

def findByFirstName(firstName: String): Future[Seq[User]] = usersTable.filter(_.firstName === firstName).result

def findById(userId: Long): Future[User] = usersTable.filter(_.id === userId).result.head

def delete(userId: Long): Future[Int] = usersTable.filter(_.id === userId).delete

}


DatabaseConfig



trait DatabaseConfig extends Config {

val driver = slick.jdbc.PostgresProfile

import driver.api._

def db = Database.forConfig("dbname")
implicit val session: Session = db.createSession()
}


Controller



import domain.User
import javax.inject.{Inject, Singleton}
import play.api.libs.json.Json
import play.api.mvc._
import repository.UsersDao

import scala.concurrent.{ExecutionContext, Future}

@Singleton
class UserController @Inject() ()(cc: ControllerComponents, parsers: PlayBodyParsers)(implicit exec: ExecutionContext) extends AbstractController(cc) {
def addUser = Action.async(parse.json[User]) { req => {
UsersDao.create(req.body).map({ user =>
Ok(Json.toJson(user))
})
}
}









share|improve this question






















  • Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
    – Sarvesh Kumar Singh
    Nov 23 at 5:30










  • Could you please share your application.conf for db looks like you have not set the maximum connection.
    – Amit Prasad
    Nov 23 at 6:06
















0














ive come across this problem :



Caused by: org.postgresql.util.PSQLException: FATAL: sorry, too many clients already


The app works, but i can only make like 3 or 4 requests and then im getting this error, so whats happening (im guessing) is im creating new connections per request and id like to keep one connection per app lifecycle, any idea how to modify the code to do so?



Tried injecting UsersDao to my controller instead of using it as an object but that changes nothing



Im really new to scala so any help is appreciated



Dao



import config.DatabaseConfig
import domain.{User, UsersTable}
import slick.jdbc.PostgresProfile.api._
import slick.sql.SqlAction

import scala.concurrent.Future
trait BaseDao extends DatabaseConfig {

val usersTable = TableQuery[UsersTable]


protected implicit def executeFromDb[A](action: SqlAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
println(db)
db.run(action)
}

}
object UsersDao extends BaseDao {

def findAll: Future[Seq[User]] = usersTable.result

def create(user: User): Future[Long] = usersTable.returning(usersTable.map(_.id)) += user

def findByFirstName(firstName: String): Future[Seq[User]] = usersTable.filter(_.firstName === firstName).result

def findById(userId: Long): Future[User] = usersTable.filter(_.id === userId).result.head

def delete(userId: Long): Future[Int] = usersTable.filter(_.id === userId).delete

}


DatabaseConfig



trait DatabaseConfig extends Config {

val driver = slick.jdbc.PostgresProfile

import driver.api._

def db = Database.forConfig("dbname")
implicit val session: Session = db.createSession()
}


Controller



import domain.User
import javax.inject.{Inject, Singleton}
import play.api.libs.json.Json
import play.api.mvc._
import repository.UsersDao

import scala.concurrent.{ExecutionContext, Future}

@Singleton
class UserController @Inject() ()(cc: ControllerComponents, parsers: PlayBodyParsers)(implicit exec: ExecutionContext) extends AbstractController(cc) {
def addUser = Action.async(parse.json[User]) { req => {
UsersDao.create(req.body).map({ user =>
Ok(Json.toJson(user))
})
}
}









share|improve this question






















  • Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
    – Sarvesh Kumar Singh
    Nov 23 at 5:30










  • Could you please share your application.conf for db looks like you have not set the maximum connection.
    – Amit Prasad
    Nov 23 at 6:06














0












0








0







ive come across this problem :



Caused by: org.postgresql.util.PSQLException: FATAL: sorry, too many clients already


The app works, but i can only make like 3 or 4 requests and then im getting this error, so whats happening (im guessing) is im creating new connections per request and id like to keep one connection per app lifecycle, any idea how to modify the code to do so?



Tried injecting UsersDao to my controller instead of using it as an object but that changes nothing



Im really new to scala so any help is appreciated



Dao



import config.DatabaseConfig
import domain.{User, UsersTable}
import slick.jdbc.PostgresProfile.api._
import slick.sql.SqlAction

import scala.concurrent.Future
trait BaseDao extends DatabaseConfig {

val usersTable = TableQuery[UsersTable]


protected implicit def executeFromDb[A](action: SqlAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
println(db)
db.run(action)
}

}
object UsersDao extends BaseDao {

def findAll: Future[Seq[User]] = usersTable.result

def create(user: User): Future[Long] = usersTable.returning(usersTable.map(_.id)) += user

def findByFirstName(firstName: String): Future[Seq[User]] = usersTable.filter(_.firstName === firstName).result

def findById(userId: Long): Future[User] = usersTable.filter(_.id === userId).result.head

def delete(userId: Long): Future[Int] = usersTable.filter(_.id === userId).delete

}


DatabaseConfig



trait DatabaseConfig extends Config {

val driver = slick.jdbc.PostgresProfile

import driver.api._

def db = Database.forConfig("dbname")
implicit val session: Session = db.createSession()
}


Controller



import domain.User
import javax.inject.{Inject, Singleton}
import play.api.libs.json.Json
import play.api.mvc._
import repository.UsersDao

import scala.concurrent.{ExecutionContext, Future}

@Singleton
class UserController @Inject() ()(cc: ControllerComponents, parsers: PlayBodyParsers)(implicit exec: ExecutionContext) extends AbstractController(cc) {
def addUser = Action.async(parse.json[User]) { req => {
UsersDao.create(req.body).map({ user =>
Ok(Json.toJson(user))
})
}
}









share|improve this question













ive come across this problem :



Caused by: org.postgresql.util.PSQLException: FATAL: sorry, too many clients already


The app works, but i can only make like 3 or 4 requests and then im getting this error, so whats happening (im guessing) is im creating new connections per request and id like to keep one connection per app lifecycle, any idea how to modify the code to do so?



Tried injecting UsersDao to my controller instead of using it as an object but that changes nothing



Im really new to scala so any help is appreciated



Dao



import config.DatabaseConfig
import domain.{User, UsersTable}
import slick.jdbc.PostgresProfile.api._
import slick.sql.SqlAction

import scala.concurrent.Future
trait BaseDao extends DatabaseConfig {

val usersTable = TableQuery[UsersTable]


protected implicit def executeFromDb[A](action: SqlAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
println(db)
db.run(action)
}

}
object UsersDao extends BaseDao {

def findAll: Future[Seq[User]] = usersTable.result

def create(user: User): Future[Long] = usersTable.returning(usersTable.map(_.id)) += user

def findByFirstName(firstName: String): Future[Seq[User]] = usersTable.filter(_.firstName === firstName).result

def findById(userId: Long): Future[User] = usersTable.filter(_.id === userId).result.head

def delete(userId: Long): Future[Int] = usersTable.filter(_.id === userId).delete

}


DatabaseConfig



trait DatabaseConfig extends Config {

val driver = slick.jdbc.PostgresProfile

import driver.api._

def db = Database.forConfig("dbname")
implicit val session: Session = db.createSession()
}


Controller



import domain.User
import javax.inject.{Inject, Singleton}
import play.api.libs.json.Json
import play.api.mvc._
import repository.UsersDao

import scala.concurrent.{ExecutionContext, Future}

@Singleton
class UserController @Inject() ()(cc: ControllerComponents, parsers: PlayBodyParsers)(implicit exec: ExecutionContext) extends AbstractController(cc) {
def addUser = Action.async(parse.json[User]) { req => {
UsersDao.create(req.body).map({ user =>
Ok(Json.toJson(user))
})
}
}






scala connection client slick






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 at 22:59









adamblumstein

153




153












  • Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
    – Sarvesh Kumar Singh
    Nov 23 at 5:30










  • Could you please share your application.conf for db looks like you have not set the maximum connection.
    – Amit Prasad
    Nov 23 at 6:06


















  • Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
    – Sarvesh Kumar Singh
    Nov 23 at 5:30










  • Could you please share your application.conf for db looks like you have not set the maximum connection.
    – Amit Prasad
    Nov 23 at 6:06
















Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
– Sarvesh Kumar Singh
Nov 23 at 5:30




Since your def db = Database.forConfig("dbname") is a def. Every db.createSession() will create be a new Database.forConfig("dbname") call and will result in a new Datebase client which will be used only once to create that session and the next createSession will create another client. You need to ensure that you have just one Database object. One way of doing it is to make it val db = Database.forConfig("dbname"). And add some mechanism for reconnection only if the current connection breaks,
– Sarvesh Kumar Singh
Nov 23 at 5:30












Could you please share your application.conf for db looks like you have not set the maximum connection.
– Amit Prasad
Nov 23 at 6:06




Could you please share your application.conf for db looks like you have not set the maximum connection.
– Amit Prasad
Nov 23 at 6:06

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438878%2fscala-slick-too-many-clients-already%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438878%2fscala-slick-too-many-clients-already%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

What visual should I use to simply compare current year value vs last year in Power BI desktop

Alexandru Averescu

Trompette piccolo