`
zhaobohao
  • 浏览: 21381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mysql分库分表时的主键生成策略

阅读更多
传送门:http://blog.csdn.net/bluishglc/article/details/7710738#java

请各位参考上面地址.

这种主键生成方式,相对于twritter的生成方式,好处在于,id的值是可以控制的,你想让它生成什么样子的id都可以实现.

这里贴一下测试 程序 ,在我的机器上I7 2720 ,16G.单台mysql,最高达到2800/s.两台mysql并发,最高达到4800/s

受制于cpu的多线程处理能力 ,当用3台,4台mysql测试时,性能并没有任何 提高 ,由此可知,已经达到了cpu多线程的最高处理能力
package mysqlJDBC;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

public class JdbcTest {

	@Test
	public void test() throws SQLException {
		
		 getConn37();
		  getConn38();
		long begin = System.currentTimeMillis();
		int step = 10000;
		long  total=3061;
		
		
		for (int i = 0; i < step; i+=2) {
//			System.out.println("count i="+i);
			new Thread(new Runnable() {

				@Override
				public void run() {

					try {
						DruidPooledConnection conn = getConn37();
						PreparedStatement ps1 = conn
								.prepareStatement("REPLACE INTO Tickets64 (stub) VALUES ('a')");
						PreparedStatement ps2 = conn
								.prepareStatement("SELECT LAST_INSERT_ID()");
						ps1.execute();
						ResultSet rs = ps2.executeQuery(); // 执行预处理语句获取查询结果集
						while (rs.next()) {
							System.out.println(rs.getString(1));
							System.out.println(System.currentTimeMillis() - begin);
						}
						rs.close();
						 ps1.close();
						 ps2.close();
						 conn.close();

					} catch (SQLException e) {
						e.printStackTrace();
					}
					 
				}
			}).start();
			new Thread(new Runnable() {

				@Override
				public void run() {

					try {
						DruidPooledConnection conn = getConn38();
						PreparedStatement ps1 = conn
								.prepareStatement("REPLACE INTO Tickets64 (stub) VALUES ('a')");
						PreparedStatement ps2 = conn
								.prepareStatement("SELECT LAST_INSERT_ID()");
						ps1.execute();
						ResultSet rs = ps2.executeQuery(); // 执行预处理语句获取查询结果集
						while (rs.next()) {
							System.out.println(rs.getString(1));
							System.out.println(System.currentTimeMillis() - begin);
						}
						rs.close();
						 ps1.close();
						 ps2.close();
						 conn.close();

					} catch (SQLException e) {
						e.printStackTrace();
					}
					 
				}
			}).start();

		}
		
		
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("total is " + total);
		System.out.println("per fix is " + (step * 1000) / total);
	}

	private static DruidPooledConnection getConn37() {
		
		
		
		
		DruidPooledConnection conn = null;
		try {
			  conn = DbConnectionFactory.getDataSource37().getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
private static DruidPooledConnection getConn38() {
		
		
		
		
		DruidPooledConnection conn = null;
		try {
			  conn = DbConnectionFactory.getDataSource38().getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
}

 class DbConnectionFactory{
	 private DbConnectionFactory(){
		 
	 }
	 public static DruidDataSource getDataSource38()
	 {
		 return Holder38.druidDataSource;
	 }
	 public static DruidDataSource getDataSource37()
	 {
		 return Holder37.druidDataSource;
	 }
	 static class  Holder38{
		 public  static  DruidDataSource druidDataSource= Holder38.getConnectionPool();
		 private static   DruidDataSource getConnectionPool(){
			 DruidDataSource	dataSource = new DruidDataSource();
				dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
				dataSource.setUsername("root"); 
				dataSource.setPassword("1qaz2wsx"); 
				dataSource.setUrl("jdbc:mysql://192.168.1.38:3308/idserver"); 
				dataSource.setInitialSize(100); 
				dataSource.setMinIdle(50); 
				dataSource.setMaxActive(200); 
				// 启用监控统计功能  dataSource.setFilters("stat");
				dataSource.setPoolPreparedStatements(true);// for mysql
				dataSource.setMaxPoolPreparedStatementPerConnectionSize(100);
				//配置一个连接在池中最小生存的时间,单位是毫秒
				dataSource.setMinEvictableIdleTimeMillis(300000);
				 return dataSource;
		 }
	 }
	 
	 static class  Holder37{
		 public  static  DruidDataSource druidDataSource= Holder37.getConnectionPool();
		 private static   DruidDataSource getConnectionPool(){
			 DruidDataSource	dataSource = new DruidDataSource();
				dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
				dataSource.setUsername("root"); 
				dataSource.setPassword("1qaz2wsx"); 
				dataSource.setUrl("jdbc:mysql://192.168.1.37:3308/idserver"); 
				dataSource.setInitialSize(100); 
				dataSource.setMinIdle(50); 
				dataSource.setMaxActive(200); 
				// 启用监控统计功能  dataSource.setFilters("stat");
				dataSource.setPoolPreparedStatements(true);// for mysql
				dataSource.setMaxPoolPreparedStatementPerConnectionSize(100);
				//配置一个连接在池中最小生存的时间,单位是毫秒
				dataSource.setMinEvictableIdleTimeMillis(300000);
				 return dataSource;
		 }
	 }
 }

分享到:
评论

相关推荐

    MySQL分库分表技术

    **MySQL分库分表技术** 随着互联网业务的快速发展,数据量呈现爆炸性增长,单个数据库的性能瓶颈问题日益突出。在这种背景下,MySQL的分库分表技术应运而生,旨在解决高并发、大数据量场景下的性能挑战。本篇将深入...

    MySQL 分库分表的实现原理及演示案例.zip

    在实现MySQL分库分表的过程中,通常会遇到一些挑战,如数据一致性、事务处理、跨库跨表查询等。为了应对这些问题,可以使用以下技术: 1. **ShardingSphere**:Apache ShardingSphere是一个开源的分布式数据库解决...

    第五节课交易分库分表详解一1

    本节主要讨论了当数据库压力达到极限,尤其是订单相关表成为超大表时,如何有效地进行分库分表以提高系统性能。以下是对相关知识点的详细解释: 1. 数据库压力与优化策略: - **容量问题**:随着数据量的激增,...

    分库分表入门级-lzg

    ShardingSphere支持标准、自定义和长事务类型的分布式事务,并提供主键生成策略,如UUID、Snowflake算法等。其架构设计灵活,可应对业务规模的变化,实现平滑扩容。 **三、分布式主键生成** 1. **UUID**:虽然全局...

    Mycat读写分离、主从切换、分库分表的操作记录- 线上操作手册

    ### Mycat读写分离、主从切换、分库分表的操作记录—线上操作手册 #### 一、Mycat简介及关键特性 Mycat是一个开源的分布式数据库系统,能够作为一个中间件帮助开发者管理和优化数据库资源。随着业务增长和技术演进...

    第六节课交易分库分表详解二1

    在选择ID生成策略时,需要权衡各种因素,包括性能、可读性、依赖性、扩展性和容错性。例如,对于大型电商系统,可能会更倾向于使用Redis,因为它能提供有序递增的ID,但同时也需要考虑网络带宽的消耗和对第三方服务...

    Mycat数据库分库分表

    2. 表结构设计:在分库分表后,表的主键需要调整,通常采用全局唯一ID生成器生成分布式主键,保证数据的唯一性。 3. SQL改写:由于分片的存在,SQL不能再直接操作全量数据,需要对SQL进行改写,Mycat会自动完成这个...

    基于mybatis插件实现轻量级分库分表方案-亿级数据mysql存储解决方案-mybatis-sharding.zip

    在应对大数据量的存储与查询问题时,分库分表是一种常见的优化策略。MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 ...

    MySQL查询优化、分库分表、负载均衡、Nginx+Tomcat+Redis (负载均衡+session共享)

    ### MySQL查询优化、分库分表、负载均衡、Nginx+Tomcat+Redis (负载均衡+session共享) #### 一、MySQL查询优化 在实际应用中,优化MySQL查询是提高系统性能的关键步骤之一。以下是一些重要的优化技巧: 1. **...

    sharding-jdbc之——分库分表实例完整源码.zip

    标题"sharding-jdbc之——分库分表实例完整源码.zip"提到了"sharding-jdbc",这是一个用于Java的分布式数据库中间件,它提供了分库分表的功能,帮助解决大数据量下的性能瓶颈问题。"分库分表"是将一个大表的数据分散...

    Springboot2.x+ShardingSphere实现分库分表的示例代码

    在本文中,我们将深入探讨如何使用Springboot 2.x 和 ShardingSphere 来实现分库分表的功能。分库分表是一种数据库优化策略,用于处理大数据量和高并发场景下的性能问题。ShardingSphere 是一个分布式数据库解决方案...

    SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】.doc

    在现代软件开发中,随着业务量的增长,单一数据库往往难以满足高性能、高并发的需求,因此分库分表成为了一种常见的解决方案。传统的分库分表方案如Mycat虽然强大,但因其bug较多,使得许多人转向Sharding-JDBC等...

    MySQL面试经典100题(收藏版,附答案).doc

    - 分库分表面临的问题包括事务处理、跨节点JOIN、统计计算、数据迁移、ID生成、排序分页等挑战。 6. **InnoDB与MyISAM的区别**: - InnoDB支持事务处理,MyISAM不支持。 - InnoDB支持外键,MyISAM不支持。 - ...

    mysql面试题100题,包含答案和解析.docx

    - 水平与垂直分库分表是两种主要策略,中间件如Sharding-JDBC、Mycat等可辅助实现。 - 分库分表面临事务处理、跨节点查询、数据迁移、ID生成和排序分页等挑战。 5. **InnoDB与MyISAM的区别**: - InnoDB支持事务...

    Sharding-Jdbc在springboot中配置

    type: SNOWFLAKE # 主键生成策略 ``` 3. 使用分片算法 在配置了分片规则后,Sharding-Jdbc会根据定义的分片策略自动路由查询到正确的分库和分表。开发者可以在编写SQL查询时,像操作普通表一样操作分片表。...

    100道mysql的面试题

    - 分库分表策略包括水平和垂直划分,中间件如Sharding-JDBC、Mycat等用于协调。 - 分库分表带来的挑战包括事务处理、跨节点JOIN、聚合操作、数据迁移和ID生成。 **5. InnoDB与MyISAM的区别** - InnoDB支持事务和...

    mysql面试题及答案

    MySQL作为一款广泛使用的开源关系型数据库管理系统,其面试题涵盖了多个方面,包括索引的使用、死锁的处理、SQL优化、分库分表设计以及存储引擎的区别等。下面将详细解释这些知识点。 1. **MySQL索引使用注意事项**...

    MySQL 70 道面试题及答案.docx

    **分库分表中间件**:sharding-jdbc、Mycat、TDDL、Oceanus、Vitess、Atlas等 **分库分表问题:** 1. 分布式事务处理 2. 跨节点Join 3. 跨节点聚合操作 4. 数据迁移和容量规划 5. ID生成 6. 跨分片排序分页 **...

    MySQL 75道面试题及答案.docx

    MySQL 分库分表设计 1. 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数据拆分到多个库中。 2. 水平分表:以字段为依据,按照一定策略(hash、range 等),将一个表中的数据拆分到多个表...

    100道MySql面试题

    分库分表可能遇到的问题: 1. 事务问题:需要用分布式事务 2. 跨节点 Join 的问题:解决这一问题可以分两次查询实现 3. 跨节点的 count,order by,group by 以及聚合函数问题:分别在各个节点上得到结果后在应用程序...

Global site tag (gtag.js) - Google Analytics