×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

没太明白,能否再讲详细些

“所有primary key都用int”的意思是不是说和我一样,每个表都做一个id字段,只不过不用sequence控制。
比如:
Table A: id , fld1,fld2
Table B: id , fld1,fld2

Table id_tbl: current_id, tbl_name

每次对A,B进行insert 操作的时候,都先去id_tbl里面查一下该表当前的id号,然后取出+1,insert 进A,B。
如果这样做的话,为什么不直接从A,B中取出当前最大的id ,然后在程序中+1.我觉得后者唯一的坏处就是每次必须查出所有排序记录,然后取最大值,数据量大的话影响速度,而前者只需查一个记录就行。
有没有更简便的方法?

另外一个问题是:
在CMP中,如何做这些SQL处理(从id_tbl查出Table A的当前最大id,在程序中转换,得到在Table A中插入新记录需要的id)?EJBQL?相关程序代码是放在一个business method里面吗?
谢谢!
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / 问个EJB的小问题
    在设计数据库表的时候,如果表内没有明显的单一primary key或者主键不是int类型,我一般喜欢用数据库自带的sequence做一个流水号id,这样在做程序的时候方便很多,而且在大数据量情况下,int的查询速度比string还是有很明显的优势。

    现在的问题是,如果用CMP维护这些字段,因为没有手写的SQL语句,怎样运用插入sequence呢 ?考虑到web based application可能有的同步并发问题,我觉得在Java 代码中用+1的方法实现不是很可靠。

    有人碰到过类似的问题吗?

    以前没有实际动手做过EJB,理解还不够深刻,请多指教。
    • 不要用流水号,那东西不好控制,我从来不用。所有primary key都用int,然后建另外一张表,保存当前所有表的当前id,然后在程序里控制。同步问题不用你考虑CMP Container比你聪明多了。我们有80几个CMP从来没出过问题。
      • 没太明白,能否再讲详细些
        “所有primary key都用int”的意思是不是说和我一样,每个表都做一个id字段,只不过不用sequence控制。
        比如:
        Table A: id , fld1,fld2
        Table B: id , fld1,fld2

        Table id_tbl: current_id, tbl_name

        每次对A,B进行insert 操作的时候,都先去id_tbl里面查一下该表当前的id号,然后取出+1,insert 进A,B。
        如果这样做的话,为什么不直接从A,B中取出当前最大的id ,然后在程序中+1.我觉得后者唯一的坏处就是每次必须查出所有排序记录,然后取最大值,数据量大的话影响速度,而前者只需查一个记录就行。
        有没有更简便的方法?

        另外一个问题是:
        在CMP中,如何做这些SQL处理(从id_tbl查出Table A的当前最大id,在程序中转换,得到在Table A中插入新记录需要的id)?EJBQL?相关程序代码是放在一个business method里面吗?
        谢谢!
        • 刚才在网上搜索了一下,这个问题其实就是primary key generation问题,解决方法很多,大多数是用session bean实现一个专门生成primary key的方法。
          由于某种原因,我想在这里用个临时取巧的方法,用java.uitl.Date.getTime()得到一个Long类型的数值来做primary key,虽然不规范,但临时对付一下应该没问题吧。

          请问这样用有什么potential risk 吗?

          另外问个英语问题,“临时取巧的方法”用英文怎么表达?我原来记得有个单词专门表达这个意思。
          • 这种方法不便于管理,你不能随心所欲的决定下一个id是多少。
        • 前者的好处是你可以随意改动下一个id,如果用后一种办法,下一个id必须在已经存在的id的基础上加1,这样不灵活。而且用max()函数查找最大的id效率非常低。EJBQL在不同的开发工具中有不同的,webshpere中有专门编辑EJBQL的finder。
      • 是不是每次插入新记录的时候,ejb的client首先查找并修改那张保存id的表,然后再执行EJB 的create?
        • yes
      • 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.
      • I do not know your solution is real project or not, but it does not sound like a real thing.
        • 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.
          • 两位帮我看看#1581753吧,谢谢!
          • you'll get bad performance.