`

JDBC数据源(DataSource)的简单实现

阅读更多
数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少创建数据库连接的次数,提高了系统性能。

对于数据源的应用,一般都选择实用开源的数据源或数据库连接池来使用,比如,常见的有DBCP、C3P0、Proxool等等。但用起来有些笨重和麻烦。下面自己手动实现个精简的数据源,代码如下:

package com.lavasoft.simpledatesource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.sql.DataSource;
import java.util.Collections;
import java.util.LinkedList;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.io.PrintWriter;

/**
* 一个简单的DataSource实现
*
* @author leizhimin 2010-1-14 0:03:17
*/
public class SimpleDateSource implements DataSource {
        private static Log log = LogFactory.getLog(SimpleDateSource.class);
        private static final String dirverClassName = "com.mysql.jdbc.Driver";
        private static final String url = "jdbc:mysql://127.0.0.1:3306/testdb";
        private static final String user = "root";
        private static final String pswd = "leizhimin";
        //连接池
        private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>());
        private static SimpleDateSource instance = new SimpleDateSource();

        static {
                try {
                        Class.forName(dirverClassName);
                } catch (ClassNotFoundException e) {
                        log.error("找不到驱动类!", e);
                }
        }

        private SimpleDateSource() {
        }

        /**
         * 获取数据源单例
         *
         * @return 数据源单例
         */
        public SimpleDateSource instance() {
                if (instance == null) instance = new SimpleDateSource();
                return instance;
        }

        /**
         * 获取一个数据库连接
         *
         * @return 一个数据库连接
         * @throws SQLException
         */
        public Connection getConnection() throws SQLException {
                synchronized (pool) {
                        if (pool.size() > 0) return pool.removeFirst();
                        else return makeConnection();
                }
        }

        /**
         * 连接归池
         *
         * @param conn
         */
        public static void freeConnection(Connection conn) {
                pool.addLast(conn);
        }

        private Connection makeConnection() throws SQLException {
                return DriverManager.getConnection(url, user, pswd);
        }

        public Connection getConnection(String username, String password) throws SQLException {
                return DriverManager.getConnection(url, username, password);
        }

        public PrintWriter getLogWriter() throws SQLException {
                return null;
        }

        public void setLogWriter(PrintWriter out) throws SQLException {

        }

        public void setLoginTimeout(int seconds) throws SQLException {

        }

        public int getLoginTimeout() throws SQLException {
                return 0;
        }

        public <T> T unwrap(Class<T> iface) throws SQLException {
                return null;
        }

        public boolean isWrapperFor(Class<?> iface) throws SQLException {
                return false;
        }
}
这个数据源的实现虽然很简陋,总代码量不到百行,却基本上实现了数据源的所有功能,达到了提高Connection复用的目的。

如果你想做的更复杂些,做个配置文件,
配置数据库连接信息
写个后台线程监控连接池的Connection超时、被强制关闭、池的尺寸、当前大小等等。
再完善下数据源的log相关方法的实现。
功能就很强大了。

欢迎参与完善!
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/265073
分享到:
评论

相关推荐

    weblogic配置jdbc数据源

    weblogic配置jdbc数据源weblogic配置jdbc数据源weblogic配置jdbc数据源

    分库分表,多数据源的切换

    通过使用sharding-jdbc分库分表,以及多数据源的切换

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。

    springboot双数据源

    双数据源 oracle mysql #数据源1 spring.datasource.db1.url=jdbc:mysql://192.168.1.1:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.db1.username=root spring.datasource....

    springboot2+两种方式:(读写分离、动态DataSource、事务懒处理)+sharding-jdbc.zip

    (1)、AbstractRoutingDataSource注册多数据源,AOP实现读写分离、读写源自动切换 (2)、一主多从,多个从库的负载均衡策略可以自定义。(双主多从、故障转移因mysql环境为一主一从,所以代码未实现,不难实现,...

    dynamic-datasource+shardingsphere-jdbc实现分库分表demo

    博客 ...基于spring boot 2.7实现了dynamic-datasource+shardingsphere-jdbc+mybatis-plus技术栈的整合,可以动态切换数据源及对部分库表的分库分表。适用于老系统增加新的分库分表数据源。

    springboot多数据源快速启动器,基于 springBoot2.0

    一个简单能直接运行的项目基于 springBoot2.0. 它适用于读写分离,一主多从的环境。 主数据库使用 INSERT UPDATE DELETE 操作. 从数据库使用 SELECT 操作. 如果你的项目比较复杂,建议使用 sharding-jdbc .

    spring Ioc容器配置

    IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql:/...

    dynamic-datasource-spring-boot-starter-v3.5.1.zip

    Dynamic-Datasource (opens new window)- 基于 SpringBoot 的多数据源组件,功能强悍,支持 Seata 分布式事务。 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 支持数据库敏感配置信息 ...

    dynamic-datasource-spring-boot-starter-v3.5.1.tar.gz

    Dynamic-Datasource (opens new window)- 基于 SpringBoot 的多数据源组件,功能强悍,支持 Seata 分布式事务。 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 支持数据库敏感配置信息 ...

    DataSource接口介绍与使用

    JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。

    Spring Data JDBC与JDBC的区别

     DataSource:数据源  DriverManager:驱动管理  Driver:JDBC驱动  Connection:数据库连接  Statement:语句,执行SQL  PrepareStatement:预编译语句,性能更好  CallableStatement:调用存储过程  ...

    JDBCDataSource:Spring 3 演示创建到 MySQL 数据库 (NetBeans IDE) 的 JDBC 驱动程序连接和数据源连接

    JDBC数据源 Spring 3 演示创建到 MySQL 数据库 (NetBeans IDE) 的 JDBC 驱动程序连接和数据源连接

    配置MSSQL数据源连接步骤

    配置MSSQL数据源连接步骤 [很卡,设置下了分辨率了] 1.打开MSSQL ,首先确定你这MSSQL是否为启动状态,从这看,应该是没有启动的 那好,现在启动SQL 好,现在已经启动 2.配置数据源 开始-&gt;控制面版-&gt;性能和维护...

    ssh框架在application.xml中配置数据源所需jar

    &lt;property name="dataSource"&gt; &lt;ref bean="dataSource" /&gt; ${hibernate.dialect} &lt;prop key="hbm2ddl.auto"&gt;update &lt;prop key="show_sql"&gt;true &lt;value&gt;...

    数据源和连接池

    在实际项目的开发中,特别是web应用程序中,如Jsp,Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据方请求必须建立连接,存取数据,关闭连接等步骤,而数据库连接是一种非常昂贵的资源,频繁的建立连接,...

    JDBC 3.0数据库开发与设计

    4.6.1 JDBC数据源 4.6.2 实例 4.7 连接池 4.7.1 连接池数据源(Connection PoolDataSource) 4.7.2 连接池处理事件 4.7.3 三层环境下的连接池操作 4.7.4 连接池和DataSource实现 4.7.5 包含连接池的数据源...

    dbcrud:只需连接到JDBC数据源并开始CRUDing,而无需预定义任何ORM或DAO

    dbcrud目标只需连接到JDBC数据源并开始CRUDing,而无需预定义任何ORM或DAO用例: 在某些情况下,我只需要一个稍微笨拙的数据存储后端,在数据之上没有太多业务逻辑,因此目标是拥有一个快速且通用的DAO,而无需使用...

    solr-dataimporthandler-extras-2:dih-jdbc-数据源

    Solr DIH JDBC 数据源这种在 Solr DIH 之上开发的目标是通过将一些设置外部化到共享配置文件,允许 DIH 配置对各种集合通用。 多个集合可以使用相同的架构和相同的 DIH 设置。 例如,SqlEntityProcessor 的query、...

Global site tag (gtag.js) - Google Analytics