瞎j8封装第二版之数据库连接池
写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜;
所以,起码是能拿到连接了。。。
但是还是不太懂这个连接池
我也是半抄别人的,以后再搞一搞这个吧。
先是配置文件 理想是很丰满的,奈何现实。。。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=true jdbc.username=root jdbc.password=yck940522 #最小连接数 jdbc.minSize= #最大连接数 jdbc.maxSize= #初始化连接数 jdbc.initSize= #重试次数 jdbc.tryTimes= #延迟时间 jdbc.delay= jdbc.maxActiveSize= jdbc.timeOut= jdbc.check = true jdbc.checkTime =
配了那么多参数,很多都没用上。。唉,还是太菜;
package jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class DataBase {
private static String username;
private static String password;
private static String url;
private static String driver;
private static Integer minSize;
private static Integer maxSize;
private static Integer initSize;
private static Integer maxActiveSize;
private static Integer tryTimes;
private static Long delay;
private static Long timeOut;
private static Boolean checked;
private static Long checkTime;
private static DataBase instance;
private DataBase(){
InputStream in = DataBase.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
try {
p.load(in);
username = p.getProperty("jdbc.username");
password = p.getProperty("jdbc.password");
url = p.getProperty("jdbc.url");
driver = p.getProperty("jdbc.driver");
minSize = Integer.valueOf(p.getProperty("jdbc.minSize","3"));
maxSize = Integer.valueOf(p.getProperty("jdbc.maxSize","20"));
initSize = Integer.valueOf(p.getProperty("jdbc.initSize","5"));
maxActiveSize = Integer.valueOf(p.getProperty("jdbc.maxActiveSize","100"));
tryTimes =Integer.valueOf(p.getProperty("jdbc.tryTimes","2"));
delay = Long.valueOf(p.getProperty("jdbc.delay","1000"));
timeOut = Long.valueOf(p.getProperty("jdbc.timeOut","1200000"));
checked = Boolean.valueOf(p.getProperty("jdbc.check","false"));
checkTime = Long.valueOf(p.getProperty("jdbc.checkTime","30000"));
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static DataBase getInstance(){
if(instance == null){
synchronized (DataBase.class){
if(instance == null){
instance = new DataBase();
}
}
}
return instance;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getUrl() {
return url;
}
public String getDriver() {
return driver;
}
public Integer getMinSize() {
return minSize;
}
public Integer getMaxSize() {
return maxSize;
}
public Integer getInitSize() {
return initSize;
}
public Integer getMaxActiveSize() {
return maxActiveSize;
}
public Integer getTryTimes() {
return tryTimes;
}
public Long getDelay() {
return delay;
}
public Long getTimeOut() {
return timeOut;
}
public Boolean getChecked() {
return checked;
}
public Long getCheckTime() {
return checkTime;
}
}
对单例也不太懂,瞎写,有经验的大佬指正一下啊
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
public class ConnectionPool{
private static final Long lazyTime = 30000L;
private DataBase dataBase;
private AtomicInteger totalSize = new AtomicInteger(0);
private List<Connection> freeConnections = new Vector<Connection>();
private ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
private static ConnectionPool instance;
private ConnectionPool(){
this.dataBase = DataBase.getInstance();
init();
}
public static ConnectionPool getInstance(){
if(instance == null){
synchronized (ConnectionPool.class){
if(instance == null){
instance = new ConnectionPool();
}
}
}
return instance;
}
private void init(){
try {
Class.forName(dataBase.getDriver());
for(int i=0;i<dataBase.getInitSize();i++){
Connection connection = createConnection();
freeConnections.add(connection);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private synchronized Connection createConnection(){
try {
Class.forName(dataBase.getDriver());
Connection conn= DriverManager.getConnection(dataBase.getUrl(),dataBase.getUsername(),dataBase.getPassword());
totalSize.incrementAndGet();
return conn;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
private synchronized Connection getConnection() {
Connection conn= null;
try {
if(totalSize.get() < dataBase.getMaxSize()){
if(freeConnections.size()>0){
conn = freeConnections.get(0);
if(conn != null){
threadLocal.set(conn);
}
freeConnections.remove(0);
}else {
conn = createConnection();
}
}else {
wait(dataBase.getDelay());
conn = getConnection();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return conn;
}
private boolean isValid(Connection conn){
try {
if(conn == null || conn.isClosed()){
return false;
}
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
public synchronized Connection getCurrentConnection() {
Connection conn = threadLocal.get();
if(!isValid(conn)){
return getConnection();
}
return conn;
}
public void checkPool() {
if(dataBase.getChecked()){
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("空线池连接数:"+freeConnections.size());
System.out.println("总的连接数:"+totalSize.get());
}
}, lazyTime, dataBase.getCheckTime());
}
}
}
这个连接池我就不做什么说明了。。。自己只能理解最简单的。。。简单的说就是先初始化一部分连接放在一个list里,要用的时候就去取,如果没有超过上限也不用close了。。但是我一直没搞明白怎么去判断它空闲了多长时间然后close掉。。。所以很多也没实现。
大王让我写代码
2017-12-30
瞎j8封装第二版之数据库连接池的更多相关文章
- 瞎j8封装第二版之数据层的封装
看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废 ...
- 瞎j8封装第二版之用xml文件来代理dao接口
也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...
- 一只菜鸟的瞎J8封装系列的目录
因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列 一.手把手封装数据层之DButil数据库连接 ...
- 计算器-- 利用re模块 利用函数封装 第二版
import re remove_parentheses = re.compile('\([^()]+\)') def Remove_Parentheses(obj, s): # 找到内层的括号并且返 ...
- Java数据库连接池封装与用法
Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...
- 【数据库开发】如何创建MySQL数据库连接池(一个基于libmysql的MySQL数据库连接池示例(C/C++版))
http://blog.csdn.net/horace20/article/details/8087557 1. 一般架构说明 图 1 架构层次图 一般应用系统数据库访问模块可大致分为两层,一层 ...
- 关于jdbc和数据库连接池的关系(不是封装的关系)
你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...
- java 数据库连接池 Oracle版
首先应加入连接池和数据库连接的配置文件:数据库连接包:ojdbc6.jar数据库连接池包:commons-pool2-2.2.jar commons-dbc ...
- mongodb数据库连接池(java版)
mongodb数据库接口的设计 package storm.db; import java.util.ArrayList; import com.mongodb.DB; import com.mong ...
随机推荐
- (转载) Java子类与父类之间的对象转换
在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...
- Python入门 - 生成随机数
生成随机数是编程中经常用到的功能,下面讲几种常用的随机函数randint,uniform, randrange: 一.生成随机整数 randint import random a = random. ...
- html5本地存储数据,实现自动登录功能
背景: 在项目中遇到一个需求:用户登录完之后,网站自动保存用户id存储在本地,在下次打开网页时,通过id判断是否要进行登录操作. 技术方案: 在HTML5中,本地存储是一个window的属性,包括lo ...
- caioj 1237: 【最近公共祖先】树上任意两点的距离 在线倍增ST
caioj 1237: [最近公共祖先]树上任意两点的距离 倍增ST 题目链接:http://caioj.cn/problem.php?id=1237 思路: 针对询问次数多的时候,采取倍增求取LCA ...
- upload 上传类
<?php/**file: fileupload.class.php 文件上传类FileUpload本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */class U ...
- QT的radioButton组的使用
在使用Qt的radioButton控件时,会产生一个疑问,如何让你选择的那个radio得到一个数据,进行判断,网上的一些资料有些不全,容易出错. 所以你得做件事,给每个radioButton进行赋初值 ...
- 一个在 .NET 一线战斗了十年的 C# 程序员的内心独白
这是我的一个内心独白,内容有点长,希望你能耐心地看完. 估计看到标题,大部分人都会说:哇!大牛!膜拜--之类的.至于是不是大牛,那我不知道,毕竟我依然有很多地方不懂,特别是现在已经流行的 Redis ...
- selenium webdriver使用click一直失效问题的几种解决方法
想要爬取动态网页,很莫名的click失效.被这个问题困扰了很久,基本上把网上提到的所有方法试遍了,最终终于有个方法成功了,在这里总结一下. 这是我想要点击的网页,初始时实在0.5km上,它的class ...
- 企业级Tomcat安全管理优化方案
telnet管理端口保护 1. 修改默认的8005管理端口为不易猜测的端口(大于1024): <Server port=" shutdown="dangerous" ...
- Model中内部类meta详解
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性. 以下对此作一总结: Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项 ...