文档章节

通用的Java MySQL JDBC主从分离操作工具类

后海
 后海
发布于 2013/11/21 22:48
字数 663
阅读 1.9K
收藏 21
package com.mms.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public  class MySqlDB {
	//初始化
	private MySqlDB(){}
	
	//参数配置
	public static String name= "root";
	public static String pass= "root";
	public static String driver= "com.mysql.jdbc.Driver";
	
	//主库连接  jdbc:mysql//服务器地址/数据库名 ,后面的2个参数分别是登陆用户名和密码
	public static String urlM= "jdbc:mysql://localhost:3306/matoldb?useUnicode=true&characterEncoding=utf-8"; 
	//从库连接  jdbc:mysql//服务器地址/数据库名 ,后面的2个参数分别是登陆用户名和密码
	public static String urlS= "jdbc:mysql://localhost:3306/matoldb?useUnicode=true&characterEncoding=utf-8"; 
	
	
	//数据库连接、操作、结果集
	public static Connection conM;  //主库连接  
	public static Connection conS;  //从库连接
	public static Statement st;  
	public static ResultSet rs;  
	public static int isNewDriver;  //是否注册数据库连接驱动类
	
	public static void main(String[] args) {
		//System.out.println("#Log ["+MySqlDB.getConnection()+"]");
		
		//MySqlDB.insertOrUpdate("delete from mi_socket where id = 1");
		
		//MySqlDB.getList("SELECT * from mi_socket LIMIT 0,1");
		//MySqlDB.getObject("SELECT * from mi_socket where id = 1");
	}
	
	
    /*
     * 根据主从库标识,返回相应的主从库连接。 0主库 1从库
     */
    private synchronized static Connection getConnection(int ms) {  
        try {
        	//数据库驱动只注册一次
        	if(isNewDriver == 0){
        		Class.forName(driver).newInstance();
        		isNewDriver = 1;
        	}
        	
        	//从库,进行查询操作
        	if(ms == 1){
        		if(conS == null){
        			conS = DriverManager.getConnection(urlS, name, pass);
        		}
        		return conS;
        	}
        	//主库,进行增、删、改、(查)操作
        	else{  
        		if(conM == null){
        			conM = DriverManager.getConnection(urlM, name, pass);
        		}
        		return conM;
        	}
        } catch (Exception e) {  
           System.out.println("#Error log["+e.getMessage()+"]");
        }  
        //默认主库
        return conM;
    } 
    
    
    /*
     * 执行一条新增、删除、修改操作 
     */
    public synchronized static int insertOrUpdate(String sql) {  
    	getConnection(0); 
        int count =0;  
        try {  
            st = conM.createStatement();  
            count = st.executeUpdate(sql);  
        } catch (Exception e) {  
        	System.out.println("#Error log["+e.getMessage()+"]"); 
        } finally{  
            try {  
                if (st != null) {  
                    st.close();  
                    st = null;  
                }  
                if (conM != null) {  
                	conM.close();  
                	conM = null;  
                }  
            } catch (Exception e2) {  
            	System.out.println("#Error log["+e2.getMessage()+"]"); 
            }  
        }  
        return count;  
    }  

    /*
     * 执行一条查询类SQL,返回多条记录集 
     */
    public synchronized static List<Map> getList(String sql) {  
    	getConnection(1);
        
        List<Map> list = null;    
        try {  
            st = conS.createStatement();  
            rs = st.executeQuery(sql);  
            if(rs != null){
            	ResultSetMetaData md = rs.getMetaData(); //得到结果集(rs)的结构信息,比如字段数、字段名等     
                int count = md.getColumnCount(); //返回此 ResultSet 对象中的列数 
                
                Map map = null;   
                list = new ArrayList<Map>();
                while (rs.next()) {     
                	map = new HashMap();     
                	for(int i = 1; i <= count; i++) {    
                		//System.out.println("#Log ["+md.getColumnName(i)+"] ["+rs.getObject(i)+"]");
                		map.put(md.getColumnName(i), rs.getObject(i));     
                	}     
                	list.add(map);        
                }     
            } 
        } catch(Exception e) {  
        	System.out.println("#Error log["+e.getMessage()+"]");  
        } finally{  
            try {  
                if (st != null) {  
                    st.close();  
                    st = null;  
                }  
                if (rs != null) {  
                    rs.close();  
                    rs = null;  
                }  
            } catch (Exception e2) {  
            	System.out.println("#Error log["+e2.getMessage()+"]"); 
            }  
        } 
        
        return list;
    }  
    
    /*
     * 执行一条查询类SQL,返回单条记录集 
     */
    public synchronized static Map getObject(String sql) {  
        getConnection(1); 
        
        Map map = null;
        try {  
            st = conS.createStatement();  
            rs = st.executeQuery(sql);  
            if(rs != null){
            	ResultSetMetaData md = rs.getMetaData(); //得到结果集(rs)的结构信息,比如字段数、字段名等     
                int count = md.getColumnCount(); //返回此 ResultSet 对象中的列数 
                
                map = new HashMap();     
                if(rs.next()) {        
                	for(int i = 1; i <= count; i++) {    
                		//System.out.println("#Log ["+md.getColumnName(i)+"] ["+rs.getObject(i)+"]");
                		map.put(md.getColumnName(i), rs.getObject(i));     
                	}           
                }     
            } 
        } catch (Exception e) {  
        	System.out.println("#Error log["+e.getMessage()+"]");   
        } finally{  
            try {  
                if (st != null) {  
                    st.close();  
                    st = null;  
                }  
                if (rs != null) {  
                    rs.close();  
                    rs = null;  
                }                
            } catch (Exception e2) {  
            	System.out.println("#Error log["+e2.getMessage()+"]");   
            }  
        } 
        
        return map;
    }  
}



© 著作权归作者所有

后海

后海

粉丝 33
博文 48
码字总数 25623
作品 2
闵行
后端工程师
私信 提问
加载中

评论(1)

d
dizh
这个没有在spring mvc啊
MYSQL读写分离如何设置从库只同步DML不同步DDL

在学习sharding-jdbc的读写分离demo的时候发现,sharding-jdbc的时候会在主库和从库同时执行DDL语句。即创建表、删除表之类的语句。这个时候就有问题了,由于我设置的数据库主从备份,主库执...

仁江
2017/12/13
523
0
对JDBC的支持 之 7.1 概述

概述 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection co...

heroShane
2014/02/27
75
0
Uncode-DAL 1.0.18 发布,Java 通用数据访问层

Uncode-DAL 是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate、mongo等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以...

冶卫军
2016/09/29
2.1K
6
Mycat - 实现数据库的读写分离与高可用

mysql主从实现 Mycat不负责任何的数据同步问题,mysql的主从复制还得从mysql层面来实现;如果没有实现mysql的主从复制,后文就都成 如果想学习Java工程化、高性能及分布式、深入浅出。微服务...

编程SHA
2019/02/20
298
0
Sharding-JDBC:查询量大如何优化?

主人公小王入职了一家刚起步的创业公司,公司正在研发一款App。为了快速开发出能够投入市场进行宣传的版本,小王可是天天加班到很晚,忙了一段时间后终于把第一个版本赶出来了。 初期功能不多...

尹吉欢
2019/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring5 依赖注入和循环依赖处理

//TODO populateBean 注入属性 doGetBean->getSingleton 删除bean缓存

小小明1995
12分钟前
37
0
每天AC系列(七):合并两个有序链表

1 题目 LeetCode第21题,合并两个有序链表. 2 直接合并 因为已经有序了,类似归并排序中的合并一样,操作不难,直接上代码了. ListNode t = new ListNode(0);ListNode head = t;while(l1 != nu...

Blueeeeeee
15分钟前
26
0
数据结构之双向链表-c语言实现

原文链接:http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e5%8f%8c%e5%90%91%e9%93%be%e8%a1%a8-c%e8%af%ad%e8%a8%80%e5%ae%9e%e7%8e%b0/ 这次完成了双向链表的代......

无心的梦呓
16分钟前
41
0
Check If a String Is Numeric in Java

1. Introduction Oftentimes while operating upon Strings, we need to figure out whether a String is a valid number or not. In this tutorial, we’ll explore multiple ways to detec......

Ciet
22分钟前
26
0
SpringCloud 基础教程(六)-负载均衡Ribbon

 我的博客:兰陵笑笑生,欢迎浏览博客!  上一章 SpringCloud基础教程(五)-配置中心热生效和高可用当中,我们对配置中心进行进行了深入的了解,本章将继续微服务架构的深入学习,了解在微服务...

_兰陵笑笑生
56分钟前
49
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部