Files
exposed-wiki/DataBase-and-DataSource.md
Michael Kofler 8d4c20f786 Update DataBase-and-DataSource.md
transaction mode for SQLite, pooling for MySQL, some driver version numbers updated
2020-04-16 14:45:16 +02:00

3.8 KiB

Working with DataBase and DataSource

Every database access using Exposed is starting by obtaining a connection and creating a transaction.
First of all, you have to tell Exposed how to connect to a database by using Database.connect function. It won't create a real database connection but only provide a descriptor for future usage.

A real connection will be instantiated later by calling transaction lambda (see Transaction for more details).

To get a Database instance by simple providing connection parameters:

val db = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")

It is also possible to provide javax.sql.DataSource for advanced behaviors such as connection pooling:

val db = Database.connect(dataSource)
  • Note: Starting Exposed 0.10 executing this code more than once per db will create leaks in your application, hence it is recommended to store it for later use. For example:
object DbSettings {
   val db by lazy { 
       Database.connect(/* setup connection */)
   }
}

DataSource

  • PostgreSQL
Database.connect("jdbc:postgresql://localhost:12346/test", driver = "org.postgresql.Driver", 
                 user = "root", password = "your_pwd")  
//Gradle
compile("org.postgresql:postgresql:42.2.2")  
  • PostgreSQL using the pgjdbc-ng JDBC driver
Database.connect("jdbc:pgsql://localhost:12346/test", driver = "com.impossibl.postgres.jdbc.PGDriver", 
                 user = "root", password = "your_pwd")  
//Gradle
compile("com.impossibl.pgjdbc-ng", "pgjdbc-ng", "0.8.3")  
  • MySQL/MariaDB
Database.connect("jdbc:mysql://localhost:3306/test", driver = "com.mysql.jdbc.Driver", 
                 user = "root", password = "your_pwd")  
//Gradle
compile("mysql:mysql-connector-java:5.1.48")
  • MySQL/MariaDB with latest JDBC driver + Hikari pooling
val config = HikariConfig().apply {
    jdbcUrl         = "jdbc:mysql://localhost/dbname"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    username        = "username"
    password        = "secret"
    maximumPoolSize = 10
}
val dataSource = HikariDataSource(config)
Database.connect(dataSource)
// Gradle
implementation "mysql:mysql-connector-java:8.0.19"
implementation "com.zaxxer:HikariCP:3.4.2"
  • Oracle
Database.connect("jdbc:jdbc:oracle:thin:@//localhost:1521/test", driver = "oracle.jdbc.OracleDriver", 
                 user = "root", password = "your_pwd")  
//Gradle
// Oracle jdbc-driver should be obtained from Oracle maven repo: https://blogs.oracle.com/dev2dev/get-oracle-jdbc-drivers-and-ucp-from-oracle-maven-repository-without-ides
  • SQLite
// In file
Database.connect("jdbc:sqlite:/data/data.db", "org.sqlite.JDBC")  
// In memory
Database.connect("jdbc:sqlite:file:test?mode=memory&cache=shared", "org.sqlite.JDBC")  
// For both: set SQLite compatible isolation level, see 
// https://github.com/JetBrains/Exposed/wiki/FAQ
TransactionManager.manager.defaultIsolationLevel = 
    Connection.TRANSACTION_SERIALIZABLE
    // or Connection.TRANSACTION_READ_UNCOMMITTED
//Gradle
compile("org.xerial:sqlite-jdbc:3.30.1")  
  • H2
// Database in file, needs full path or relative path starting with ./
Database.connect("jdbc:h2:./myh2file", "org.h2.Driver")
// In memory
Database.connect("jdbc:h2:mem:regular", "org.h2.Driver")  
// In memory / keep alive between connections/transactions
Database.connect("jdbc:h2:mem:regular;DB_CLOSE_DELAY=-1;", "org.h2.Driver")  
//Gradle
compile("com.h2database:h2:1.4.199")  
  • SQL Server
Database.connect("jdbc:sqlserver://localhost:32768;databaseName=test", "com.microsoft.sqlserver.jdbc.SQLServerDriver", 
                 user = "root", password = "your_pwd")  
//Gradle
compile("com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre7")