传送门: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分库分表的过程中,通常会遇到一些挑战,如数据一致性、事务处理、跨库跨表查询等。为了应对这些问题,可以使用以下技术: 1. **ShardingSphere**:Apache ShardingSphere是一个开源的分布式数据库解决...
本节主要讨论了当数据库压力达到极限,尤其是订单相关表成为超大表时,如何有效地进行分库分表以提高系统性能。以下是对相关知识点的详细解释: 1. 数据库压力与优化策略: - **容量问题**:随着数据量的激增,...
ShardingSphere支持标准、自定义和长事务类型的分布式事务,并提供主键生成策略,如UUID、Snowflake算法等。其架构设计灵活,可应对业务规模的变化,实现平滑扩容。 **三、分布式主键生成** 1. **UUID**:虽然全局...
### Mycat读写分离、主从切换、分库分表的操作记录—线上操作手册 #### 一、Mycat简介及关键特性 Mycat是一个开源的分布式数据库系统,能够作为一个中间件帮助开发者管理和优化数据库资源。随着业务增长和技术演进...
在选择ID生成策略时,需要权衡各种因素,包括性能、可读性、依赖性、扩展性和容错性。例如,对于大型电商系统,可能会更倾向于使用Redis,因为它能提供有序递增的ID,但同时也需要考虑网络带宽的消耗和对第三方服务...
2. 表结构设计:在分库分表后,表的主键需要调整,通常采用全局唯一ID生成器生成分布式主键,保证数据的唯一性。 3. SQL改写:由于分片的存在,SQL不能再直接操作全量数据,需要对SQL进行改写,Mycat会自动完成这个...
在应对大数据量的存储与查询问题时,分库分表是一种常见的优化策略。MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 ...
### MySQL查询优化、分库分表、负载均衡、Nginx+Tomcat+Redis (负载均衡+session共享) #### 一、MySQL查询优化 在实际应用中,优化MySQL查询是提高系统性能的关键步骤之一。以下是一些重要的优化技巧: 1. **...
标题"sharding-jdbc之——分库分表实例完整源码.zip"提到了"sharding-jdbc",这是一个用于Java的分布式数据库中间件,它提供了分库分表的功能,帮助解决大数据量下的性能瓶颈问题。"分库分表"是将一个大表的数据分散...
在本文中,我们将深入探讨如何使用Springboot 2.x 和 ShardingSphere 来实现分库分表的功能。分库分表是一种数据库优化策略,用于处理大数据量和高并发场景下的性能问题。ShardingSphere 是一个分布式数据库解决方案...
在现代软件开发中,随着业务量的增长,单一数据库往往难以满足高性能、高并发的需求,因此分库分表成为了一种常见的解决方案。传统的分库分表方案如Mycat虽然强大,但因其bug较多,使得许多人转向Sharding-JDBC等...
- 分库分表面临的问题包括事务处理、跨节点JOIN、统计计算、数据迁移、ID生成、排序分页等挑战。 6. **InnoDB与MyISAM的区别**: - InnoDB支持事务处理,MyISAM不支持。 - InnoDB支持外键,MyISAM不支持。 - ...
- 水平与垂直分库分表是两种主要策略,中间件如Sharding-JDBC、Mycat等可辅助实现。 - 分库分表面临事务处理、跨节点查询、数据迁移、ID生成和排序分页等挑战。 5. **InnoDB与MyISAM的区别**: - InnoDB支持事务...
type: SNOWFLAKE # 主键生成策略 ``` 3. 使用分片算法 在配置了分片规则后,Sharding-Jdbc会根据定义的分片策略自动路由查询到正确的分库和分表。开发者可以在编写SQL查询时,像操作普通表一样操作分片表。...
- 分库分表策略包括水平和垂直划分,中间件如Sharding-JDBC、Mycat等用于协调。 - 分库分表带来的挑战包括事务处理、跨节点JOIN、聚合操作、数据迁移和ID生成。 **5. InnoDB与MyISAM的区别** - InnoDB支持事务和...
MySQL作为一款广泛使用的开源关系型数据库管理系统,其面试题涵盖了多个方面,包括索引的使用、死锁的处理、SQL优化、分库分表设计以及存储引擎的区别等。下面将详细解释这些知识点。 1. **MySQL索引使用注意事项**...
**分库分表中间件**:sharding-jdbc、Mycat、TDDL、Oceanus、Vitess、Atlas等 **分库分表问题:** 1. 分布式事务处理 2. 跨节点Join 3. 跨节点聚合操作 4. 数据迁移和容量规划 5. ID生成 6. 跨分片排序分页 **...
MySQL 分库分表设计 1. 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数据拆分到多个库中。 2. 水平分表:以字段为依据,按照一定策略(hash、range 等),将一个表中的数据拆分到多个表...
分库分表可能遇到的问题: 1. 事务问题:需要用分布式事务 2. 跨节点 Join 的问题:解决这一问题可以分两次查询实现 3. 跨节点的 count,order by,group by 以及聚合函数问题:分别在各个节点上得到结果后在应用程序...