- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java代码实现mysql分表操作(用户行为记录)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
DayInterval
implements
ServletContextListener{
private
static
SimpleDateFormat simpleDateFormat=
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
);
public
static
void
showDayTime() {
Timer dTimer =
new
Timer();
dTimer.schedule(
new
TimerTask() {
@Override
public
void
run() {
System.out.println(
"每日任务执行:"
+simpleDateFormat.format(
new
Date()));
LogTableCreate logTableCreate =
new
LogTableCreate();
Thread thread=
new
Thread(logTableCreate);
thread.start();
}
},
1000
,
24
*
60
*
60
*
1000
);
//24* 60* 60 * 1000(第一次一秒后执行,以后每次一天后执行)
}
@Override
public
void
contextDestroyed(ServletContextEvent arg0) {
// showDayTime();
}
@Override
public
void
contextInitialized(ServletContextEvent arg0) {
showDayTime();
}
}
|
LogTableCreate 用来做表分表是否已经创建,如现在是9月在启动时检查是否存在当月表记录,不存在则创建存在则不创建,另外检查是否存在10月份表记录,不存在则创建(提前创建一个也空表,以此类推).
拷贝代码修改createsql(建表sql),URL (数据库地址),USER (数据库连接用户),PASSWORD(数据库连接密码) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
public
class
LogTableCreate
extends
TimerTask {
private
static
final
Log log = LogFactory.getLog(LogTableCreate.
class
);
public
static
final
String TBASENAME=
"tb_log"
;
private
String createsql =
" (\r\n"
+
" `ID` varchar(64) NOT NULL COMMENT '主键id',\r\n"
+
" `userid` varchar(255) DEFAULT NULL COMMENT '用户id',\r\n"
+
" `username` varchar(255) DEFAULT NULL COMMENT '用户姓名',\r\n"
+
" `useridcard` varchar(255) DEFAULT NULL COMMENT '用户身份证号码',\r\n"
+
" `realname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\r\n"
+
" `logintime` varchar(255) DEFAULT NULL COMMENT '登录时间',\r\n"
+
" `exittime` varchar(64) DEFAULT NULL COMMENT '退出时间',\r\n"
+
" `ippath` varchar(255) DEFAULT NULL COMMENT 'ip地址',\r\n"
+
" `macpath` varchar(255) DEFAULT NULL COMMENT 'mac地址',\r\n"
+
" `usercreatedtime` varchar(255) DEFAULT NULL COMMENT '用户创建时间',\r\n"
+
" `userbusidaddress` varchar(255) DEFAULT NULL COMMENT '用户钱包地址',\r\n"
+
" `member` int(11) DEFAULT NULL COMMENT '是否是会员',\r\n"
+
" `membertype` int(11) DEFAULT NULL COMMENT '会员类型',\r\n"
+
" `spare1` varchar(255) DEFAULT NULL,\r\n"
+
" `spare2` varchar(255) DEFAULT NULL,\r\n"
+
" `spare3` varchar(255) DEFAULT NULL,\r\n"
+
" PRIMARY KEY (`ID`)\r\n"
+
")"
;
private
SimpleDateFormat sdyyyy =
new
SimpleDateFormat(
"yyyy"
);
private
SimpleDateFormat sdmm =
new
SimpleDateFormat(
"MM"
);
private
static
final
String URL =
""
;
private
static
final
String USER =
""
;
private
static
final
String PASSWORD =
""
;
//得到表名
public
static
String gettable() {
Date date =
new
Date();
LogTableCreate logTableCreate=
new
LogTableCreate();
String yyyy = logTableCreate.sdyyyy.format(date);
String mm = logTableCreate.sdmm.format(date);
String nmm = logTableCreate.getNextMM(mm);
return
TBASENAME+yyyy+mm;
}
//得到下一个月
private
String getNextMM(String mm){
String nmm =
""
;
int
imm = Integer.parseInt(mm);
if
(imm>=
12
){
nmm =
"01"
;
}
else
{
imm++;
if
(imm>
9
)
nmm =
""
+imm;
else
nmm =
"0"
+imm;
}
return
nmm;
}
@Override
public
void
run() {
Date date =
new
Date();
String yyyy = sdyyyy.format(date);
String mm = sdmm.format(date);
String nmm = getNextMM(mm);
String nyyyy =
""
;
if
(
"01"
.equals(nmm)){
nyyyy =
""
+(Integer.parseInt(yyyy)+
1
);
}
else
{
nyyyy = yyyy;
}
log.info(
"日志表检查及创建:"
+yyyy+
" - "
+mm+
" | "
+nyyyy+
"-"
+nmm);
String temp = TBASENAME+yyyy+mm;
//日志表名称
boolean
has =
false
;
try
{
has = hasTable(temp);
}
catch
(Exception e){
log.error(
"当前操作日志表是否存在判断时发生错误:"
+e.getMessage());
return
;
}
if
(!has){
try
{
createTable(temp);
}
catch
(Exception e){
log.error(
"当前操作日志表创建时发生错误:"
+e.getMessage());
return
;
}
}
temp = TBASENAME+nyyyy+nmm;
has =
false
;
try
{
has = hasTable(temp);
}
catch
(Exception e){
log.error(
"待用日志表是否存在判断时发生错误:"
+e.getMessage());
return
;
}
if
(!has){
try
{
createTable(temp);
}
catch
(Exception e){
log.error(
"待用日志表创建时发生错误:"
+e.getMessage());
return
;
}
}
log.info(
"日志表检查及创建结束"
);
}
public
boolean
hasTable(String table)
throws
Exception{
Class.forName(
"com.mysql.jdbc.Driver"
);
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
boolean
state =
false
;
DatabaseMetaData meta = conn.getMetaData();
ResultSet set;
set = meta.getTables(
null
,
null
, table.toLowerCase(),
null
);
while
(set.next()) {
state =
true
;
break
;
}
Statement stmt =
null
;
try
{
stmt = conn.createStatement();
}
catch
(Exception e){
log.error(
"检查日志表是否存在时发生错误:"
+e.getMessage());
throw
e;
}
finally
{
if
(stmt!=
null
)
try
{
stmt.close();
}
catch
(Exception e) {
//e.printStackTrace();
}
}
conn.close();
return
state;
}
public
void
createTable(String table)
throws
Exception{
try
{
Class.forName(
"com.mysql.jdbc.Driver"
);
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
String sql =
"create table "
+table+createsql;
Statement stmt =
null
;
stmt = conn.createStatement();
stmt.execute(sql);
}
catch
(Exception e){
log.error(
"初始化日志表时发生错误:"
+e.getMessage());
throw
e;
}
}
}
|
补充:java水平分表_Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的 。
从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大; 。
另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈.
首先我们来了解一下为什么要做分库分表。在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量、连接数、处理能力等都很有限,数据库本身的“有状态性”导致了它并不像Web和应用服务器那么容易扩展。那么在我们的业务中,是否真的有必要进行分库分表,就可以从上面几个条件来考虑.
单机储存容量。您的数据量是否在单机储存中碰到瓶颈。比如饿了么一天产生的用户行为数据就有24T,那么在传统的单机储存中肯定是不够的.
连接数、处理能力。在我们的用户量达到一定程度时,特定时间的并发量又成了一个大问题,在一个高并发的网站中秒级数十万的并发量都是很正常的。在普通的单机数据库中秒级千次的操作问题都很大.
所以在我们进行分库分表之前我们最好考虑一下,我们的数据量是不是够大,并发量是不是够大。如果您的回答是肯定的,那我们就开始做吧.
解决事务问题目前有两种可行的方案:分布式事务和通过应用程序与数据库共同控制实现事务下面对两套方案进行一个简单的对比.
优点:交由数据库管理,简单有效 。
缺点:性能代价高,特别是shard越来越多时 。
原理:将一个跨多个数据库的分布式事务分拆成多个仅处 于单个数据库上面的小事务,并通过应用程序来总控 各个小事务.
优点:性能上有优势 。
缺点:需要应用程序在事务控制上做灵活设计。如果使用 了spring的事务管理,改动起来会面临一定的困难.
分库分表的实施策略.
分库分表有垂直切分和水平切分两种.
3.1 何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上.
例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等.
3.2 何谓水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上.
例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上.
3.3 应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑.
如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选.
而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担.
在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂直切分,又需要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行水平切分.
mycat是怎样实现分库分表的?mycat里面通过定义路由规则来实现分片表(路由规则里面会定义分片字段,以及分片算法)。分片算法有多种,你所说的hash是其中一种,还有取模、按范围分片等等。在mycat里面,会对所有传递的sql语句做路由处理(路由处理的依据就是表是否分片,如果分片,那么需要依据分片字段和对应的分片算法来判断sql应该传递到哪一个、或者哪几个、又或者全部节点去执行) 。
以上就是我对Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的 问题及其优化总结,如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/soul17999/article/details/101372765 。
最后此篇关于java代码实现mysql分表操作(用户行为记录)的文章就讲到这里了,如果你想了解更多关于java代码实现mysql分表操作(用户行为记录)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个网站。 必须登录才能看到里面的内容。 但是,我使用此代码登录。 doc = Jsoup.connect("http://46.137.207.181/Account/Login.aspx")
我正在尝试为我的域创建一个 SPF 记录并使我的邮件服务器能够对其进行评估。我在邮件服务器上使用 Postfix 并使用 policyd-spf (Python) 来评估记录。目前,我通过我的私有(p
我需要为负载平衡的 AWS 站点 mywebsite.com 添加 CName 记录。记录应该是: @ CNAME mywebsite.us-east-1.elb.amazon
我目前正在开发一个相当大的多层应用程序,该应用程序将部署在海外。虽然我希望它在解聚后不会折叠或爆炸,但我不能 100% 确定这一点。因此,如果我知道我可以请求日志文件,以准确找出问题所在以及原因,那就
我使用以下命令从我的网络摄像头录制音频和视频 gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1
我刚刚开始使用 ffmpeg 将视频分割成图像。我想知道是否可以将控制台输出信息保存到日志文件中。我试过“-v 10”参数,也试过“-loglevel”参数。我在另一个 SO 帖子上看到使用 ffmp
我想针对两个日期查询我的表并检索其中的记录。 我这样声明我的变量; DECLARE @StartDate datetime; DECLARE @EndDate datetime; 并像这样设置我的变量
在 javascript 中,我可以使用简单的 for 循环访问对象的每个属性,如下所示 var myObj = {x:1, y:2}; var i, sum=0; for(i in myObj) s
最近加入了一个需要处理大量代码的项目,我想开始记录和可视化调用图的一些流程,让我更好地理解一切是如何组合在一起的。这是我希望在我的理想工具中看到的: 每个节点都是一个函数/方法 如果一个函数可以调用另
如何使用反射在F#中创建记录类型?谢谢 最佳答案 您可以使用 FSharpValue.MakeRecord [MSDN]创建一个记录实例,但是我认为F#中没有任何定义记录类型的东西。但是,记录会编译为
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 Sequelize 的新手并且遇到了一些语法问题。我制作了以下模型: // User sequelize.define('user', { name: { type: DataTyp
${student.name} Notify 这是我的output.jsp。请注意,我已经放置了一个链接“Notify”以将其转发到 display.jsp 上。但我不确定如何将 Stud
例如,这是我要做的查询: server:"xxx.xxx.com" AND request_url:"/xxx/xxx/xxx" AND http_X_Forwarded_Proto:(https O
我一直在开发大量 Java、PHP 和 Python。所有这些都提供了很棒的日志记录包(分别是 Log4J、Log 或logging)。这在调试应用程序时有很大帮助。特别是当应用程序 headless
在我的Grails应用程序中,我异步运行一些批处理过程,并希望该过程记录各种状态消息,以便管理员以后可以检查它们。 我考虑过将log4j JDBC附加程序用作最简单的解决方案,但是据我所知,它不使用D
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
如果我有一条包含通用字段的记录,在更改通用字段时是否有任何方法可以模仿方便的 with 语法? 即如果我有 type User = // 'photo can be Bitmap or Url {
假设我有一个名为 Car 的自定义对象。其中的所有字段都是私有(private)的。 public class Car { private String mName; private
当记录具有特定字段时,我需要返回 true 的函数,反之亦然。示例: -record(robot, {name, type=industrial, ho
我是一名优秀的程序员,十分优秀!