【问题标题】:How to properly create and connect to database with Kotlin Exposed?如何使用 Kotlin Exposed 正确创建和连接数据库?
【发布时间】:2021-05-04 08:09:47
【问题描述】:

我确实检查了类似的问题here,但它并没有像我预期的那样工作,我仍然需要重新连接到创建的数据库,我不确定如何避免这种情况,甚至是否可以避免。

这是我的代码:

hikari.properties:

jdbcUrl=jdbc:mariadb://localhost:3306/
driverClassName=org.mariadb.jdbc.Driver
username=root
dataSource.databaseName=DBNAME //this doesn't seem to do much, I'm getting the same behavior with or without it
fun initDB() {
    val config = HikariConfig("/hikari.properties")
    val ds = HikariDataSource(config)
    transaction(connect(ds)) {
        SchemaUtils.createDatabase("DBNAME")
    }
        
    config.jdbcUrl = "jdbc:mariadb://localhost:3306/DBNAME"
    //ds.jdbcUrl = "jdbc:mariadb://localhost:3306/DBNAME" //THIS WILL NOT WORK
    val ds2 = HikariDataSource(config)
    transaction(connect(ds2)) {
        SchemaUtils.create( Tables... )
    }
}

我创建一个新数据源的原因是,否则我会得到这个错误: java.lang.IllegalStateException: The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes. HikariConfigMXBean 似乎不允许更改 jdbcUrl。

一定有更优雅的方式来做到这一点,对吧?

【问题讨论】:

    标签: kotlin jdbc hikaricp kotlin-exposed


    【解决方案1】:

    这不是一个好习惯。创建和填充数据库是两个独立的过程。 DB由DBA创建一次,然后您只需连接并使用它。您的方法存在巨大的安全漏洞。来自数据源的用户必须具有创建数据库权限。

    但是,如果您想继续当前的方法,首先您应该创建一个不使用数据源的数据库,然后创建数据源并连接到数据库。像这样的

    import com.zaxxer.hikari.HikariConfig
    import com.zaxxer.hikari.HikariDataSource
    import org.jetbrains.exposed.sql.Database
    import org.jetbrains.exposed.sql.SchemaUtils
    import org.jetbrains.exposed.sql.Table
    import org.jetbrains.exposed.sql.transactions.transaction
    
    fun main(args: Array<String>) {
        
        //LOAD proerties
        val config = HikariConfig("/hikari.properties")
        //Hikari properties content
        //    jdbcUrl=jdbc:mysql://localhost:3306/hikari
        //    driverClassName=com.mysql.cj.jdbc.Driver
        //    username=root
        //    password=<pwd here>
        //Here replace dbname from jdbc url to empty
        transaction(Database.connect(url = config.jdbcUrl.replace("hikari", ""),
            driver = config.driverClassName,
            user = config.username,
            password = config.password)) {
            SchemaUtils.createDatabase("hikari")
        }
    
        val ds = HikariDataSource(config)
        transaction(Database.connect(ds)) {
            SchemaUtils.create(Users)
        }
    }
    
    object Users : Table() {
        val id = varchar("id", 10) // Column<String>
        val name = varchar("name", length = 50) // Column<String>
        override val primaryKey = PrimaryKey(id, name = "PK_User_ID")
    }
    

    【讨论】:

    • 感谢它的工作!这是一个大学项目,这就是为什么我希望所有东西都放在一个地方,所以如果需要的话更容易演示和解释,但我不喜欢我的代码的外观。所以在我的情况下,即使这不是一个好的做法也应该没问题,但也许我应该重新考虑。
    猜你喜欢
    • 2020-06-20
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多