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
相关文章:
如何用y主机助手快速搭建网站?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
,购物网站怎么盈利呢?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何用西部建站助手快速创建专业网站?
建站之星如何实现网站加密操作?
网站企业制作流程,用什么语言做企业网站比较好?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
宝塔新建站点为何无法访问?如何排查?
建站之星安装模板失败:服务器环境不兼容?
如何高效配置IIS服务器搭建网站?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站168自助建站系统:快速模板定制与SEO优化指南
焦点电影公司作品,电影焦点结局是什么?
如何通过商城自助建站源码实现零基础高效建站?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何快速查询域名建站关键信息?
建站之星伪静态规则如何设置?
大连网站设计制作招聘信息,大连投诉网站有哪些?
建站之星如何优化SEO以实现高效排名?
如何在Golang中指定模块版本_使用go.mod控制版本号
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
宝塔面板创建网站无法访问?如何快速排查修复?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
如何在景安云服务器上绑定域名并配置虚拟主机?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择靠谱的建站公司加盟品牌?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
,怎么用自己头像做动态表情包?
建站之星如何开启自定义404页面避免用户流失?
图册素材网站设计制作软件,图册的导出方式有几种?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
网站代码制作软件有哪些,如何生成自己网站的代码?
平台云上自助建站如何快速打造专业网站?
如何制作算命网站,怎么注册算命网站?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
定制建站哪家更专业可靠?推荐榜单揭晓
攀枝花网站建设,攀枝花营业执照网上怎么年审?
如何在腾讯云免费申请建站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
c++ stringstream用法详解_c++字符串与数字转换利器
广州商城建站系统开发成本与周期如何控制?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何在企业微信快速生成手机电脑官网?
开封网站制作公司,网络用语开封是什么意思?
如何实现建站之星域名转发设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。