This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / 问个EJB的小问题在设计数据库表的时候,如果表内没有明显的单一primary key或者主键不是int类型,我一般喜欢用数据库自带的sequence做一个流水号id,这样在做程序的时候方便很多,而且在大数据量情况下,int的查询速度比string还是有很明显的优势。
现在的问题是,如果用CMP维护这些字段,因为没有手写的SQL语句,怎样运用插入sequence呢 ?考虑到web based application可能有的同步并发问题,我觉得在Java 代码中用+1的方法实现不是很可靠。
有人碰到过类似的问题吗?
以前没有实际动手做过EJB,理解还不够深刻,请多指教。
-fatbean(洗心革面 第一千次);
2004-1-28
{481}
(#1580474@0)
-
不要用流水号,那东西不好控制,我从来不用。所有primary key都用int,然后建另外一张表,保存当前所有表的当前id,然后在程序里控制。同步问题不用你考虑CMP Container比你聪明多了。我们有80几个CMP从来没出过问题。
-jqian(Q_Q);
2004-1-28
(#1580543@0)
-
没太明白,能否再讲详细些
-fatbean(洗心革面 第一千次);
2004-1-28
{697}
(#1580640@0)
-
刚才在网上搜索了一下,这个问题其实就是primary key generation问题,解决方法很多,大多数是用session bean实现一个专门生成primary key的方法。由于某种原因,我想在这里用个临时取巧的方法,用java.uitl.Date.getTime()得到一个Long类型的数值来做primary key,虽然不规范,但临时对付一下应该没问题吧。
请问这样用有什么potential risk 吗?
另外问个英语问题,“临时取巧的方法”用英文怎么表达?我原来记得有个单词专门表达这个意思。
-fatbean(洗心革面 第一千次);
2004-1-28
{280}
(#1581021@0)
-
这种方法不便于管理,你不能随心所欲的决定下一个id是多少。
-jqian(Q_Q);
2004-1-28
(#1581071@0)
-
前者的好处是你可以随意改动下一个id,如果用后一种办法,下一个id必须在已经存在的id的基础上加1,这样不灵活。而且用max()函数查找最大的id效率非常低。EJBQL在不同的开发工具中有不同的,webshpere中有专门编辑EJBQL的finder。
-jqian(Q_Q);
2004-1-28
(#1581069@0)
-
是不是每次插入新记录的时候,ejb的client首先查找并修改那张保存id的表,然后再执行EJB 的create?
-cathy618(明年);
2004-1-28
(#1580690@0)
-
yes
-jqian(Q_Q);
2004-1-28
(#1581060@0)
-
From my experience, using sequence as primary is the best solution for transactional table. It is easy and fast. By the way, as far as I know, for oracle most of company use this solution.
-funnyguy(喜欢加拿大);
2004-1-29
(#1581837@0)
-
I do not know your solution is real project or not, but it does not sound like a real thing.
-funnyguy(喜欢加拿大);
2004-1-29
(#1581838@0)
-
I have been in this company more than one year and this is a REAL project. Every person in the company is using it. CMP container is much more complicated and clever than you think.
-jqian(Q_Q);
2004-1-29
(#1581848@0)
-
两位帮我看看#1581753吧,谢谢!
-fatbean(洗心革面 第一千次);
2004-1-29
(#1582031@0)
-
you'll get bad performance.
-easyway(漂流);
2004-1-30
(#1583358@0)