java类中如何判断数据库中已经有了重复记录

Polly_Bruce 2010-06-07 07:06:22
想往数据库里插入一条记录,但数据库中已经有了此记录,所以插不进去。

我的想法是:在插入数据库之前,先在 java 类中判断数据库中是否有了相同的记录,
如果有,则提示有重复记录;
如果没有,则可以插入这条记录;

不知道想法我的想法是否正确,待朋友们指点和给出具体的实现方案。

...全文
1877 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyu_zy 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 polly_bruce 的回复:]
记录中不只一个字段,以其中两个字段为一组 表示唯一记录
[/Quote]

做联合唯一性约束嘛,又不一定非要一个字段。如:
create unique index UK_TEST on ORD_WORK_ORDER (字段1, 字段2);

虽然唯一性约束是避免小概率事件的一种方式,不过在JAVA的编码中我们一般不通过异常去控制流程,至少将这种情况降得很低(因为通过高可用性验证以及源码的说明,对于异常控制流程的消耗是很大的)。
dddddz 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dr_lou 的回复:]
这种事让数据库替你做吧,你捕获unique异常即可。
[/Quote]
11楼正解!
chenxizhiyi 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xieyuooo 的回复:]
在一定的情况下,可以这样去实现,因为这个出错的概率几乎为0,当然也不排除出错的可能性,那就是并发了。但是这个对于普通的系统来说几乎不太可能发生如此小的概率事件,其实从你发起验证到验证、验证结束、插入数据、提交数据,这个过程(可能你通过网络异步AJAX验证会消耗网络传送时间),那么就可能出现两个或两个以上的请求验证都是成功的并插入同一条记录。

我不清楚你说的同一条记录是什么意思,是编号相同还是……

补充一下,如果你想将这种小概率事件放弃掉,而且又不愿意用约束,此时在JAVA代码中的方法做一个同步操作,可以相对一个对象,如果当前的DAO层为一个单例,那么可以相对this或直接在方法体上使用synchronized进行同步操作。

意思就是在对这个共享资源的使用的过程中,只允许最多一个线程在执行,多个线程谁先抢到谁执行,后面来的必须等待,也就是不可能有两个线程同时调用校验方法和提交方法,不过你真要这样做,就不能使用客户端发出请求了,因为校验和提交必须一起完成。

这样有点影响性能,对高并发业务同样不适用,其实和约束道理也是差不多,就是序列化,要控制并发,基本的思路都是序列化,只是如何序列化才能降低粒度,在那个地方序列化更加适合系统规范。
[/Quote]

小胖说的甚合我意,嘻嘻。
以前用ajax做过,当时还为自己学会了ajax而洋洋自得,看了小胖说的,觉得自己,哎~~
Polly_Bruce 2010-06-08
  • 打赏
  • 举报
回复
记录中不只一个字段,以其中两个字段为一组 表示唯一记录
dr_lou 2010-06-08
  • 打赏
  • 举报
回复
这种事让数据库替你做吧,你捕获unique异常即可。
amos1989 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 apollo_ts 的回复:]
那个字段加上唯一约束就行了,重复就异常。
[/Quote]
++
Pbulic 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 apollo_ts 的回复:]
那个字段加上唯一约束就行了,重复就异常。
[/Quote]

直接,简单
lq282514781 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xuhuanchao 的回复:]

根据条件查询是否有数据,有返回true否则返回false
[/Quote]正解
APOLLO_TS 2010-06-08
  • 打赏
  • 举报
回复
那个字段加上唯一约束就行了,重复就异常。
创世纪小马哥 2010-06-08
  • 打赏
  • 举报
回复
方法1:使用Ajax进行无刷新查询
方法2:唯一性设置,捕获重复异常。
niujw002 2010-06-08
  • 打赏
  • 举报
回复
7楼正解。
jovinmavis 2010-06-08
  • 打赏
  • 举报
回复
用dwr和ajax都可以,服务端去判断下可以用来确定是否重复的字段即可
sirtener 2010-06-08
  • 打赏
  • 举报
回复
直接写一个存储过程来执行不就得了,这样更直接,比在代码中实现更好,可以有效的避免因为并发而引起的数据不一致的问题
liyangyun1986 2010-06-08
  • 打赏
  • 举报
回复
用AJAX在前台判断下,如果有的话,不让它提交不就得了。
zihuzihuzihu 2010-06-08
  • 打赏
  • 举报
回复
head_java_web 2010-06-08
  • 打赏
  • 举报
回复
小胖说的很对嘛
  • 打赏
  • 举报
回复
我说个很简单的办法,你根据主键或唯一的那个条件去查,如果查出的对象不为空,就说明有,那么你不执行插入就是了,如果为空就执行插入
这个是个很笨很简单的办法,不知道对楼主有用么
xieyu_zy 2010-06-07
  • 打赏
  • 举报
回复
补充一下,如果你想将这种小概率事件放弃掉,而且又不愿意用约束,此时在JAVA代码中的方法做一个同步操作,可以相对一个对象,如果当前的DAO层为一个单例,那么可以相对this或直接在方法体上使用synchronized进行同步操作。

意思就是在对这个共享资源的使用的过程中,只允许最多一个线程在执行,多个线程谁先抢到谁执行,后面来的必须等待,也就是不可能有两个线程同时调用校验方法和提交方法,不过你真要这样做,就不能使用客户端发出请求了,因为校验和提交必须一起完成。

这样有点影响性能,对高并发业务同样不适用,其实和约束道理也是差不多,就是序列化,要控制并发,基本的思路都是序列化,只是如何序列化才能降低粒度,在那个地方序列化更加适合系统规范。
xieyu_zy 2010-06-07
  • 打赏
  • 举报
回复
在一定的情况下,可以这样去实现,因为这个出错的概率几乎为0,当然也不排除出错的可能性,那就是并发了。但是这个对于普通的系统来说几乎不太可能发生如此小的概率事件,其实从你发起验证到验证、验证结束、插入数据、提交数据,这个过程(可能你通过网络异步AJAX验证会消耗网络传送时间),那么就可能出现两个或两个以上的请求验证都是成功的并插入同一条记录。

我不清楚你说的同一条记录是什么意思,是编号相同还是很多字段相同,如果是编号相同我认为用ORACLE自带的序列管理器或自定义序列管理器就可以实现。如果你真需要完全无误的错误,那种即为小的概率事件都不放过的话,其实较为保险的还是用唯一性约束来控制,但是它会造成后来者抛一个异常,而且在高并发插入表中可能会导致阻塞问题(因为约束将使得插入进行检查的序列化检查过程)。
水中影子 2010-06-07
  • 打赏
  • 举报
回复
根据条件查询是否有数据,有返回true否则返回false
加载更多回复(2)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧