diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt b/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt index 3c032ed6..3de5580b 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt @@ -12,7 +12,7 @@ import java.util.* import java.util.concurrent.ConcurrentHashMap import javax.sql.DataSource -class Database private constructor(val connector: () -> Connection) { +class Database private constructor(val url: String , val connector: () -> Connection) { internal val metadata: DatabaseMetaData get() = TransactionManager.currentOrNull()?.connection?.metaData ?: with(connector()) { try { @@ -23,8 +23,6 @@ class Database private constructor(val connector: () -> Connection) { } } - val url: String by lazy { metadata.url } - var dialect : DatabaseDialect = run { val name = url.removePrefix("jdbc:").substringBefore(':') dialects[name.toLowerCase()]?.invoke() ?: error("No dialect registered for $name. URL=$url") @@ -81,7 +79,10 @@ class Database private constructor(val connector: () -> Connection) { private fun doConnect(getNewConnection: () -> Connection, setupConnection: (Connection) -> Unit = {}, manager: (Database) -> TransactionManager = { ThreadLocalTransactionManager(it, DEFAULT_ISOLATION_LEVEL) } ): Database { - return Database { + val newConnection = getNewConnection() + val url = newConnection.metaData.url!! + newConnection.close() + return Database(url) { getNewConnection().apply { setupConnection(this) } }.apply { TransactionManager.registerManager(this, manager(this)) @@ -99,6 +100,7 @@ class Database private constructor(val connector: () -> Connection) { ): Database { return doConnect( getNewConnection, manager = manager ) } + fun connect(url: String, driver: String, user: String = "", password: String = "", setupConnection: (Connection) -> Unit = {}, manager: (Database) -> TransactionManager = { ThreadLocalTransactionManager(it, DEFAULT_ISOLATION_LEVEL) }): Database { Class.forName(driver).newInstance() diff --git a/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/ThreadLocalManagerTest.kt b/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/ThreadLocalManagerTest.kt index 366edd9f..dcdbe6cf 100644 --- a/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/ThreadLocalManagerTest.kt +++ b/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/ThreadLocalManagerTest.kt @@ -14,12 +14,11 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import org.sqlite.SQLiteConnection import org.sqlite.SQLiteDataSource +import org.sqlite.jdbc4.JDBC4DatabaseMetaData import java.io.PrintWriter -import java.sql.Connection -import java.sql.DriverManager -import java.sql.SQLException -import java.sql.SQLTransientException +import java.sql.* import java.util.logging.Logger import javax.sql.DataSource import kotlin.concurrent.thread @@ -123,7 +122,7 @@ class ConnectionExceptions { fail("Should have thrown an exception") } catch (e : SQLException){ assertThat(e.toString(), Matchers.containsString("BROKEN_SQL_THAT_CAUSES_EXCEPTION")) - assertEquals(5, wrappingDataSource.connections.size) + assertEquals(6, wrappingDataSource.connections.size) wrappingDataSource.connections.forEach { assertFalse(it.commitCalled) assertTrue(it.rollbackCalled) @@ -155,8 +154,9 @@ class ConnectionExceptions { } fail("Should have thrown an exception") } catch (e: CommitException) { - assertEquals(5, wrappingDataSource.connections.size) - wrappingDataSource.connections.forEach { + // + 1 b/c preparing Database instance required 1 connection + assertEquals(5 + 1, wrappingDataSource.connections.size) + wrappingDataSource.connections.drop(1).forEach { assertTrue(it.commitCalled) assertTrue(it.closeCalled) }