社区
Java SE
帖子详情
关于多线程操作数据库
zlh218
2007-12-24 09:15:21
各位大侠:
我现在遇到一个很难解决的问题,就是我使用多个线程往数据库中的同一表插入数据,该表没有建立主键,只有一个靠程序来控制增加的序列,也就是程序运行新插一条数据,然后将序列值增加1,现在因为使用了多线程,序列值出现重复。很难解决!这几个线程插入数据是在不同的线程对象里面操作的,也就是说每一个线程操作的是不同的对象资源,而不是去操作同一对象,所以用同步方法是无法解决这个问题的,我现在项目非常着急,请问高手们有没有什么好的办法帮我一把,不胜感激!
...全文
87
8
打赏
收藏
关于多线程操作数据库
各位大侠: 我现在遇到一个很难解决的问题,就是我使用多个线程往数据库中的同一表插入数据,该表没有建立主键,只有一个靠程序来控制增加的序列,也就是程序运行新插一条数据,然后将序列值增加1,现在因为使用了多线程,序列值出现重复。很难解决!这几个线程插入数据是在不同的线程对象里面操作的,也就是说每一个线程操作的是不同的对象资源,而不是去操作同一对象,所以用同步方法是无法解决这个问题的,我现在项目非常着急,请问高手们有没有什么好的办法帮我一把,不胜感激!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
GODProbe
2007-12-25
打赏
举报
回复
如果要每次启动的时候重新从数据库得到最大序列号也可以,加在单件的构造函数里即可:
private Sequence(){
查询数据库获得最大序列号
将这个最大序列号赋给xlh
}
上面的getMaxSeq方法应该等效于:
public long getMaxSeq(){
synchronized(this) {
xlh += 1;
return xlh;
}
}
GODProbe
2007-12-25
打赏
举报
回复
做一个单件:
内部存放最大序列号,然后用一个同步方法专做序列号步进的,返回步进后的序列号(这个同步方法实际上锁的是本对象,因为是单件)
所有线程均通过这个单件得到合法序列号,如下示意代码:
class Sequence{
private long xlh = 0;
private Sequence(){}
private ststic Sequence seq = new Sequence();
public static Sequence getInstance(){
return seq;
}
public synchronized long getMaxSeq(){
xlh += 1;
return xlh;
}
}
使用:Sequence.getInstance().getMaxSeq()可以在多线程环境下获得不会重复的序列号。
Ami121
2007-12-24
打赏
举报
回复
我以前实现是楼上说的那种方式 在数据库里面增加一个自增长的字段 关注一下是否有其它好的办法
newflypig
2007-12-24
打赏
举报
回复
将那个自增的字段设置成主键或者索引就OK了
zlh218
2007-12-24
打赏
举报
回复
感谢各位的回复,但是各位提供的方法好像与我所要的有所区别,因为我所要的是不改变表的结构。因为如果要是多线程查询同一表,改变表结果也是无用的啊。所以哪位高人有更好的办法请提供答案不胜感激!
老紫竹
2007-12-24
打赏
举报
回复
1 呈清概念,用同步方法是无法解决这个问题的
你可以这样做
在线程的类里面增加如下代码
public static final lock = new Object();
在需要同步的代码里用这样的方式
synchronized(lock){
}
这样就能保证同步
2 序列重复?看来只需要把你的序列做成同步就可以了!
public long getNextId(){
synchronized(MyThread.lock){
......
return newId;
}
}
ml_dark
2007-12-24
打赏
举报
回复
不用自增长字段,那就在插入的时候随即生成一个时间戳作为主键,精确到毫秒,再加一定长度的随即数,这个时间是服务器时间。这样就不会出现重复的了。如是sqlserver的话,它自身有一个生成随即字符串的东西,我搞忘了,你去查查吧
数据库
操作
(使用FMDB)
- `FMDatabaseQueue`:线程安全的
数据库
操作
队列,用于处理
多线程
环境下的并发
操作
。 ### 2. FMDB安装 在CocoaPods环境下,将FMDB添加到你的`Podfile`中: ```ruby pod 'FMDB' ``` 执行`pod install`命令后,...
Java聊天室毕业设计完整版+
数据库
这个项目不仅涵盖了编程语言的基础,还涉及到了网络编程、
多线程
、
数据库
交互等多个关键知识点。以下将详细介绍这些方面: 1. **Java编程基础**:整个项目基于Java语言,因此需要对Java语法有深入理解,包括类、...
C#源码大集合
第一部分 第一章 控件
操作
第二章 文件管理 第三章 程序设置 第四章 系统维护 第五章 图像处理 第六章
数据库
开发 第七章 网络应用 第八章 Web应用 ...第00部分 基础知道 ...第02部分
数据库
ADO.NET ...
多线程
文档,实例
Android基于Socket聊天最终版
总的来说,这个项目涵盖了Android应用开发中的多个关键知识点,如Socket通信、
多线程
、
数据库
操作
和UI设计。开发者通过实现这个项目,不仅掌握了网络编程的基本原理,还锻炼了在Android平台上构建实际应用的能力。
同时打开多端口的通信程序
总结来说,这个压缩包文件包含了关于如何构建一个多端口通信系统的关键技术,结合Socket协议和ADO
数据库
操作
,为开发人员提供了一个实用且全面的示例。无论是对网络编程入门者还是经验丰富的开发者,都能从中获得有...
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章