scala的数据库连接池,基于mysql

import java.util.concurrent.ConcurrentHashMap
import com.jolbox.bonecp.{ BoneCPConfig, BoneCP }
import java.util.ResourceBundle
import java.util.LinkedList
import java.sql.DriverManager
import java.sql.Connection /**
* 数据库连接池工具类
* 语言:scala
* 时间:2016-07-09
*/
object DBConnectionPool {
private val reader = ResourceBundle.getBundle("connection")
private val max_connection = reader.getString("jeecg.max_connection") //连接池总数
private val connection_num = reader.getString("jeecg.connection_num") //产生连接数
private var current_num = 0 //当前连接池已产生的连接数
private val pools = new LinkedList[Connection]() //连接池
private val driver = reader.getString("jeecg.driver")
private val url = reader.getString("jeecg.url")
private val username = reader.getString("jeecg.username")
private val password = reader.getString("jeecg.password")
/**
* 加载驱动
*/
private def before() {
if (current_num > max_connection.toInt && pools.isEmpty()) {
print("busyness")
Thread.sleep(2000)
before()
} else {
Class.forName(driver)
}
}
/**
* 获得连接
*/
private def initConn(): Connection = {
val conn = DriverManager.getConnection(url, username, password)
conn
}
/**
* 初始化连接池
*/
private def initConnectionPool(): LinkedList[Connection] = {
AnyRef.synchronized({
if (pools.isEmpty()) {
before()
for (i <- 1 to connection_num.toInt) {
pools.push(initConn())
current_num += 1
}
}
pools
})
}
/**
* 获得连接
*/
def getConn():Connection={
initConnectionPool()
pools.poll()
}
/**
* 释放连接
*/
def releaseCon(con:Connection){
pools.push(con)
} }

配置文件

#数据库连接池配置文件
jeecg.driver=org.gjt.mm.mysql.Driver
jeecg.url=jdbc\:mysql\://0.0.0.0\:3306/jeecg?useUnicode=true&characterEncoding=utf-8
jeecg.username=root
jeecg.password=****
jeecg.max_connection=8
jeecg.connection_num=10

dao类

import java.sql.ResultSet
import java.sql.PreparedStatement
import java.sql.Connection
import java.sql.Statement
/**
* 数据操作工具类
* 语言:scala
* 时间:2016-07-09
*/
private[org] abstract class BaseDao[T](conn: Connection) {
/**
* 插入数据
* @param sql SQL语句
* @param params 参数列表
* @param convert 主键转换方法
* @return 转换结果
*/
protected def insert[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {
val pstmt = conn prepareStatement (sql, Statement.RETURN_GENERATED_KEYS)
setParameters(pstmt, params)
pstmt.executeUpdate
val rs = pstmt.getGeneratedKeys
rs.next
convert(rs)
} /**
* 更新数据
* @param sql SQL语句
* @param params 参数列表
* @return 影响行数
*/
protected def update(sql: String, params: Array[Any]) = createStatement(sql, params).executeUpdate /**
* 查询对象
* @param sql SQL语句
* @param params 参数列表
* @param convert 结果集转换方法
* @return 泛型对象
*/
protected def queryForObject[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {
val rs = query(sql, params)
if (rs.next) {
val result = convert(rs)
if (rs.next) {
val ex = new ResultsTooManyException
throw ex
} else Some(result)
} else None
} /**
* 查询对象列表
* @param sql SQL语句
* @param params 参数列表
* @param convert 结果集转换方法
* @return 泛型对象列表
*/
protected def queryForList[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {
val rs = query(sql, params)
var results = List[T]()
while (rs.next) { results = results :+ convert(rs) }
results
} /**
* 查询对象映射
* @param sql SQL语句
* @param params 参数列表
* @param convert 结果集转换方法
* @return 泛型对象映射
*/
protected def queryForMap[K, V](sql: String, params: Array[Any])(convert: ResultSet => (K, V)) = {
val rs = query(sql, params)
var results = Map[K, V]()
while (rs.next) { results += convert(rs) }
results
} /**
* 查询
* @param sql SQL语句
* @param params 参数列表
*/
private def query(sql: String, params: Array[Any]) = createStatement(sql, params).executeQuery /**
* 创建声明
* @param sql SQL语句
* @param params 参数列表
*/
private def createStatement(sql: String, params: Array[Any]) = {
val pstmt = conn prepareStatement sql
setParameters(pstmt, params)
pstmt
} /**
* 插入参数
* @param pstmt 预编译声明
* @param params 参数列表
*/
private def setParameters(pstmt: PreparedStatement, params: Array[Any]) {
for (i <- 1 to params.length) { pstmt setObject (i, params(i - 1)) }
} } /**
* 结果值读取器
*/
object ResultValueGetter { /**
* 查询结果值
* @param rs 结果集
* @param getResult 获得单个值结果的方法
* @return 值
*/
def getResultValue[T](rs: ResultSet)(getResult: ResultSet => T) = {
val result = getResult(rs)
if (rs.wasNull) None else Some(result)
} /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getStringValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getString colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getIntValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getInt colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getLongValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getLong colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getDoubleValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getDouble colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getBooleanValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getBoolean colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colNum 列号
*/
def getTimestampValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getTimestamp colNum } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getStringValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getString colName } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getIntValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getInt colName } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getLongValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getLong colName } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getDoubleValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getDouble colName } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getBooleanValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getBoolean colName } /**
* 获得字符串结果的值
* @param rs 结果集
* @param colName 列名
*/
def getTimestampValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getTimestamp colName } } /**
* 结果太多异常
*/
class ResultsTooManyException extends Exception("Returned too many results.") {}

最新文章

  1. 负margin的移位参考线
  2. MacBook Air 使用技巧
  3. smarty中section遍历数组
  4. Openstack:ice-house安装过程
  5. ios 代码截屏模糊问题解决办法
  6. 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)
  7. c# 将PPT转换成HTML
  8. [原创] zabbix学习之旅一:源码安装
  9. QT无法定位入口点QtCore4.dll(万恶的matlab啊)
  10. CodeForces 352C. Jeff and Rounding(贪心)
  11. (转载)linux中shell变量
  12. ES6 new syntax of Arrow Function
  13. LoadRunner(一)——性能测试基础及性能指标概述
  14. [Luogu P1082]同余方程
  15. vue路由的懒加载
  16. Abaqus用Dload子程序实现移动载荷
  17. JavaScript数组的一些奇葩行为
  18. phalcon断点调试(phpStorm+xdebug)
  19. 完整性约束&amp;外键变种三种关系&amp;数据的增删改
  20. Centos6.5下rsync+inotify的配置详解

热门文章

  1. Python WSGI接口
  2. hadoop学习笔记(三):hadoop文件结构
  3. 使用tcmalloc替换系统的malloc
  4. 记录:springmvc + mybatis + maven 搭建配置流程
  5. Linux : task work 机制
  6. linux基础学习之软件安装以及常用命令(三)
  7. (一)windows下安装MongoDB解压版
  8. 自己编写jQuery插件 之 放大镜
  9. 镶嵌数据集 Mosaic Dataset 的常见数据组织方式
  10. Android 时间轴的实现