java 自己实现DataSource实现实例
发布时间 - 2026-01-11 01:07:33 点击率:次java 自己实现DataSource实现代码

DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项。DataSource能提供最高性能的对数据库的并发访问,数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。
数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少了创建数据库连接的次数,提高了系统性能。下面,我们自己动手实现个精简的数据源,代码如下:
public class MyDataSource {
private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
public MyDataSource() {
for (int i = 0; i < 10; i++) {
connectionPool.add(new MyConnection(creatConnection(),this));
}
}
private Connection creatConnection() {
try {
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new ExceptionInInitializerError();
}
}
public Connection getConnection(){
System.out.println(connectionPool.size());
return connectionPool.removeFirst();
}
public void freeConnection(Connection conn){
System.out.println("DataSource Close Connection");
connectionPool.addLast(conn);
}
}
Java代码
public class MyConnection implements Connection{
private Connection connection;
private MyDataSource datasource;
public Connection getConnection() {
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
public MyConnection(Connection realconnection,MyDataSource datasource){
this.connection=realconnection;
this.datasource=datasource;
}
@Override
public void close() throws SQLException {
// TODO Auto-generated method stub
System.out.println("MyConnection Close");
datasource.freeConnection(this);
}
...
}
我们通过DataSource获得的Connection是经过包裹后的对象,这里应用到了代理模式。下面我们使用jdk的动态代理来改写MyDataSource:
Java代码
public class MyDataSource {
private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
public MyDataSource() {
for (int i = 0; i < 10; i++) {
connectionPool.add(GetProxy(creatConnection()));
}
}
private Connection GetProxy(final Connection connection) {
// TODO Auto-generated method stub
return (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object value;
if(method.getName().equalsIgnoreCase("close")){
connectionPool.addLast((Connection)proxy);
System.out.println(connectionPool.size());
return null;
}else{
value=method.invoke(connection, args);
}
System.out.println(connectionPool.size());
return value;
}
});
}
private Connection creatConnection() {
try {
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new ExceptionInInitializerError();
}
}
public Connection getConnection(){
System.out.println(connectionPool.size());
return connectionPool.removeFirst();
}
public void freeConnection(Connection conn){
System.out.println("DataSource Close Connection");
connectionPool.addLast(conn);
}
}
通过这种方式获得的Connection是通过jdk的动态代理生成的一个代理对象,该代理对象实现了Connection接口。
以上两种方式实现了我们自己的DataSource,在我们通过DataSource获得的Connection对象的close方法都已经被改写过了。在Connection对象调用close方法时,会将该Connection对象放入到缓存池中,而不是关闭对象。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# DataSource
# DataSource自己实现
# Springboot mybatis plus druid多数据源解决方案 dynamic-data
# Spring Boot 自定义数据源DruidDataSource代码
# 详解spring cloud config实现datasource的热部署
# 浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题
# 详解利用Spring的AbstractRoutingDataSource解决多数据源的问题
# Spring(AbstractRoutingDataSource)实现动态数据源切换示例
# 使用Spring的AbstractRoutingDataSource实现多数据源切换示例
# 如何在MyBatis中实现DataSource
# 自己的
# 实现了
# 过了
# 两种
# 希望能
# 谢谢大家
# 并能
# 将该
# 自己动手
# 池中
# 复用
# 在内部
# 而不是
# 提高了
# 减少了
# return
# creatConnection
# jdbc
# getConnection
# int
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何有效防御Web建站篡改攻击?
Python3.6正式版新特性预览
实例解析angularjs的filter过滤器
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
焦点电影公司作品,电影焦点结局是什么?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何获取PHP WAP自助建站系统源码?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何用西部建站助手快速创建专业网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
Java遍历集合的三种方式
如何在IIS7中新建站点?详细步骤解析
微信h5制作网站有哪些,免费微信H5页面制作工具?
常州企业网站制作公司,全国继续教育网怎么登录?
重庆市网站制作公司,重庆招聘网站哪个好?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
nginx修改上传文件大小限制的方法
长沙企业网站制作哪家好,长沙水业集团官方网站?
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
linux写shell需要注意的问题(必看)
Laravel模型事件有哪些_Laravel Model Event生命周期详解
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel如何为API生成Swagger或OpenAPI文档
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何做网站制作流程,*游戏网站怎么搭建?
教你用AI润色文章,让你的文字表达更专业
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
如何在腾讯云免费申请建站?
bing浏览器学术搜索入口_bing学术文献检索地址
php 三元运算符实例详细介绍
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
SQL查询语句优化的实用方法总结
Laravel API资源类怎么用_Laravel API Resource数据转换
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何利用DOS批处理实现定时关机操作详解
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验

