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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 1个月
简介:
开源的连接池很多,实现都不错,可是就不知道怎么做的,在研读了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,如需转载请自行联系原作者
相关文章
|
2月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
2月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
20天前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
193 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
20天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
89 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
19天前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
77 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析
|
10天前
|
监控 数据可视化 数据挖掘
直播电商复盘全解析:如何通过工具提升团队效率
直播电商作为新兴商业模式,正改变传统零售格局。其成功不仅依赖主播表现和产品吸引力,更需团队高效协作与分工优化。复盘是提升执行力的关键环节,通过总结经验、发现问题、优化流程,结合在线工具如板栗看板,可提升复盘效率。明确团队角色、建立沟通机制、制定优化方案,确保数据驱动决策,从而在竞争中保持领先。
|
23天前
|
SQL 程序员 Linux
推荐几个不错的数据库设计工具
推荐几个不错的数据库设计工具
119 11
|
2月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
128 57
|
1月前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
165 5
|
2月前
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率

推荐镜像

更多