开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JDBC数据库连接池的实现:第一天:数据源配置解析工具

简介:
+关注继续查看
开源的连接池很多,实现都不错,可是就不知道怎么做的,在研读了javax.sql包中的API规范后,想手动实现一个通用的JDBC数据库连接池。这个工作量比较大,主要目的是为了深入底层学习Java处理数据库的技术。
 
第一天:数据源配置解析工具
 
这个解析工具支持xml配置和properties配置,程序不依赖任何jdk以外的任何第三方包。
 
xml和properties文件的格式对名字有限制,xml还对格式有限制,要求符合sun公司的[url]http://java.sun.com/dtd/properties.dtd[/url]规范。
 
解析工具要完成的功能,读取配置文件,并存放到Map中,对于非必须而没有配置的属性,给以默认的属性值。
 
要求:两种配置文件读取方法通用,不进行切换。有导出配置文件的功能。
 
实现代码:
package com.blog51cto.lavasoft.ds; 

import java.util.*; 
import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
import java.io.InputStream; 

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-3-19 23:22:38 
* Company: LavaSoft([url]http://lavasoft.blog.51cto.com[/url]) 
* 数据源配置工具 
*/
 
public class DataSourceConfig { 
    private static Map<String, String> defcfgmap; 

    //初始化默认配置参数 
    static { 
        defcfgmap = new HashMap<String, String>(); 
        defcfgmap.put("driverClassName", ""); 
        defcfgmap.put("url", ""); 
        defcfgmap.put("user", ""); 
        defcfgmap.put("password", ""); 
        defcfgmap.put("type""javax.sql.DataSource"); 
        defcfgmap.put("initCreate""12"); 
        defcfgmap.put("maxIdle""8"); 
        defcfgmap.put("maxWait""10"); 
        defcfgmap.put("maxActive""5"); 
        defcfgmap.put("validationQuery", ""); 
    } 

    /** 
     * 获取数据源配置信息,本方法接受两种配置文件类型,xml和properties类型. 
     * 
     * @param cfgFilePath 配置文件的名 
     * @return 配置参数Map 
     * @throws Exception 
     */
 
    public static Map<String, String> getConfigParameter(String cfgFilePath) throws Exception { 
        Map<String, String> mcfg = new HashMap<String, String>(); 
        Pattern pp = Pattern.compile(".+properties"); 
        Pattern px = Pattern.compile(".+xml"); 
        Matcher mp = pp.matcher(cfgFilePath); 
        Matcher mx = px.matcher(cfgFilePath); 
        InputStream in = DataSourceConfig.class.getResourceAsStream(cfgFilePath); 
        Properties prop = new Properties(); 
        if (mp.matches()) { 
            prop.load(in); 
            Enumeration<String> enu = (Enumeration<String>) prop.propertyNames(); 
            while (enu.hasMoreElements()) { 
                String key = enu.nextElement(); 
                String value = prop.getProperty(key); 
                mcfg.put(key, value); 
            } 
            in.close(); 
        } else if (mx.matches()) { 
            prop.loadFromXML(in); 
            Enumeration<String> enu = (Enumeration<String>) prop.propertyNames(); 
            while (enu.hasMoreElements()) { 
                String key = enu.nextElement(); 
                String value = prop.getProperty(key); 
                mcfg.put(key, value); 
            } 
            in.close(); 
        } else { 
            throw new Exception("数据源配置文件必须为xml或者properties文件,请检查配置!"); 
        } 
        //检查没有配置的属性,并通过默认的属性值进行设置 
        Set<Map.Entry<String, String>> def = defcfgmap.entrySet(); 
        for (Map.Entry<String, String> d : def) { 
            if (!mcfg.containsKey(d.getKey())) { 
                mcfg.put(d.getKey(), d.getValue()); 
            } 
        } 
        return mcfg; 
    } 

    /** 
     * 获取默认的数据源配置信息 
     * 
     * @return 
     */
 
    private static String getDefaultConfig() { 
        return getConfig(defcfgmap); 
    } 

    /** 
     * 返回数据源配置信息的文本表述 
     * 
     * @param map 配置信息Map 
     * @return 数据源配置信息的文本表述 
     */
 

    private static String getConfig(Map<String, String> map) { 
        StringBuffer sb = new StringBuffer("数据源配置参数:\n"); 
        for (Map.Entry<String, String> ent : map.entrySet()) { 
            sb.append(ent.getKey()).append("=").append(ent.getValue()).append("\n"); 
        } 
        return sb.toString(); 
    } 

    /** 
     * 测试配置参数获取工具 
     * 
     * @param args 
     * @throws Exception 
     */
 
    public static void main(String args[]) throws Exception { 
        Map<String, String> mcfg = getConfigParameter("dscfg.xml"); 
        String cfg = getConfig(mcfg); 
        System.out.println(cfg); 
    } 
}
 
 
配置文件
dscfg.properties
driverClassName=com.mysql.jdbc.Driver 
url=jdbc:mysql://127.0.0.1:3306/mysql 
user=root 
password=leizhimin 
 
dscfg.xml
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
<comment>JDBC数据库连接池实现</comment> 
<entry key="user">root</entry> 
<entry key="password">leizhimin</entry> 
<entry key="url">jdbc:mysql://127.0.0.1:3306/mysql</entry> 
<entry key="driverClassName">com.mysql.jdbc.Driver</entry> 
</properties>
 
 
现有的方法都测试过了,还没有写导出配置的方法,接下来我会补上。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/66960,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据库连接JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
1667 0
JDBC连接数据库
  一、JDBC数据库连接通用数据访问层(JDBCDBManager.java) 代码如下: package com.myhome.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Result
1221 0
ASP数据库连接的实现
ASP数据库连接的实现 (Email: xchuntao@163.com)   摘  要:本文给出了ASP中数据库连接的多种实现方法。 关键词:ASP;ADO;OLE-DB;ODBC;数据库连接   1  引言   ASP是目前最流行的Web程序设计技术之一,它使用ADO技术对数据库进行存取。
833 0
详解JDBC连接数据库
一、概念   1. 为了能让程序操作数据库,对数据库中的表进行操作,每一种数据库都会提供一套连接和操作该数据库的驱动,而且每种数据库的驱动都各不相同,例如mysql数据库使用mysql驱动,oracle数据库使用oracle驱动,这样假如我们编写的程序哪一天想要换数据库,那样就会很不方便,因为所有连接数据库的代码都要从新编写。
919 0
jsp 数据连接池 2
引用:http://bbs.hh010.com/thread-32010-2-1.html //下面这两个是连接池,下面两个文件都放在一个mybean的包里.   package mybean;   import java.
708 0
JDBC-连接数据库
JDBC连接数据库简明教程
0 0
JDBC数据库连接池
JDBC数据库连接池
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载