Slick2 使用笔记(5) 配置数据源

本文来自:fair-jm.iteye.com 转截请注明出处

 

Slick2可以使用内置的Database(使用时导入对应数据库的对应的包

比如mysql是:import scala.slick.driver.MySQLDriver.simple._) 的 forURL方法(这个方法通过DriverManager来拿到连接 这个在前面的几个笔记里都有

还有forDriver是直接通过Driver来拿到连接)来拿到数据库连接 

Slick2也可以通过forName(JNDI)和forConfig(通过配置)的方式拿到

 

这篇po要说的是forDataSource这个方法

    /**
     * Create a Database based on a DataSource.
     */
    def forDataSource(ds: DataSource): DatabaseDef = new DatabaseDef {
      def createConnection(): Connection = ds.getConnection
    }

 这个DataSource类是:javax.sql.DataSource 

 

 

这边简单说下使用数据源的方式

数据源我这里使用阿里的Druid 这个选用哪个是无所谓的 看个人爱好吧

习惯使用Spring xml方式配置dataSource的同学 可能会对在代码上配置感到陌生 但其实也挺简单的 

配置代码如下:

package infrastructure

import com.alibaba.druid.pool.DruidDataSource
import javax.sql.DataSource

sealed class DS(val config: DataSourceConfig) {
  private val dataSource = new DruidDataSource
  conf(config)

  def get: DataSource = {
    sync(!dataSource.isInited(), dataSource.init(), dataSource)
    dataSource
  }

  def close = {
    sync(dataSource.isInited(), dataSource.close(), dataSource)
  }

  private def sync(test: => Boolean, op: => Unit, lock: AnyRef) = {
    if (test)
      lock.synchronized {
        if (test) op
      }
  }

  private def conf(config: DataSourceConfig): Unit = {
    dataSource.setUrl(config.url)
    dataSource.setUsername(config.name)
    dataSource.setPassword(config.password)
    dataSource.setInitialSize(config.initSize)
    dataSource.setMinIdle(config.minIdle)
    dataSource.setMaxActive(config.maxActive)
    dataSource.setValidationQuery(config.validateQuery)
  }
}

object DS {
  val _lock = new Object
  val db = new DS(new MyDataSourceConfig)
  def apply() = {
    _lock.synchronized {
      db.get
    }
  }

  def apply(conf: DataSourceConfig) = {
    _lock.synchronized {
      db.conf(conf)
      db.dataSource.restart()
      db.get
    }
  }
}

trait DataSourceConfig {
  def url: String
  def name: String
  def password: String
  def initSize: Int = 1
  def minIdle: Int = 1
  def maxActive: Int
  def validateQuery = "select 'x'"
}

class MyDataSourceConfig extends DataSourceConfig {
  def url = "jdbc:mysql://localhost:3306/cqrs"
  def name = "root"
  def password = ""
  def maxActive = 10
}

 

 关于以上几个参数 可以参考druid的github

 

使用也很简单:

Database.forDataSource(DS()).withSession {
      implicit session =>
        q.list
}

 

 

你可能感兴趣的:(数据源)