数据库提交对Coldfusion进程的速度不够快

时间:2011-02-24 12:28:29

标签: coldfusion railo

我有以下Coldfusion过程:

  1. 我的代码对proc的注释进行数据库调用(这会插入注释,然后调用关于正在添加的注释的事件插入proc,名为EventInsert)

  2. 然后我调用Event.GetEventByCommentId(commentId)

  3. 结果是没有返回记录,因为EventInsert尚未在步骤1中添加由CommentInsert触发的事件记录。

    我知道情况就是这样,因为如果我在步骤1和步骤2之间创建了延迟,那么在步骤2中返回一个记录集IS。

    这让我相信在步骤1中提交事件插入之前,步骤2中的读取发生得太快。

    我的问题是,如何告诉Coldfusion进程要等到第1步完成后再进行第2步中的读取?

    第一步和第二步是完全不同的方法。

    代码:

    <cfset MessageHandlerManager = AddComment(argumentCollection=arguments) />
    
    <cfset qEvents = application.API.EventManager.GetEventFeed(commentId=MessageHandlerManager.GetReturnItems()) />
    

    另外,让我补充一点,传递的commentId是有效的。我查过了。

    另一种观察方式:

    鉴于此代码:

    <!--- Calls CommentInsert proc, which inserts a comment AND inserts an
    event record by calling EventInsert within the proc --->
    <cfset var newCommentId = AddComment(argumentCollection=arguments) />
    
    <cfloop from="1" to="1000000" index="i">
    </cfloop>
    
    <!--- Gets the event record inserted in the code above --->
    <cfset qEvent =
    application.API.EventManager.GetEventFeed(commentId=newCommentId ) />
    

    当我运行上面的代码时,qEvent会返回一个有效的记录。 但是,当我注释掉循环时,记录又回来了 空。

    我认为发生的是CommentInsert返回新的 注释Id,但是当调用GetEventFeed函数时, EventInsert proc没有及时完成,也没有找到记录。

    因此,通过添加循环并延迟一点,事件插入有时间 完成,然后在GetEventFeed时返回有效记录 调用。

    所以我的问题是,如何在不使用循环的情况下阻止这种情况。

    更新: 以下是使用的两个存储过程:

    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `CommentInsert` $$
    CREATE DEFINER=`root`@`%` PROCEDURE `CommentInsert`(
            IN _commentParentId bigint,
            IN _commentObjectType int,
            IN _commentObjectId bigint,
            IN _commentText text,
            IN _commentAuthorName varchar(100),
            IN _commentAuthorEmail varchar(255),
            IN _commentAuthorWebsite varchar(512),
            IN _commentSubscribe tinyint(1),
            IN _commentIsDisabled tinyint(1),
            IN _commentIsActive tinyint(1),
            IN _commentCSI int,
            IN _commentCSD datetime,
            IN _commentUSI int,
            IN _commentUSD datetime,
            OUT _commentIdOut bigint
        )
    BEGIN
    
    
        DECLARE _commentId bigint default 0;
    
        INSERT INTO comment
                (
                commentParentId,
                commentObjectType,
                commentObjectId,
                commentText,
                commentAuthorName,
                commentAuthorEmail,
                commentAuthorWebsite,
                commentSubscribe,
                commentIsDisabled,
                commentIsActive,
                commentCSI,
                commentCSD,
                commentUSI,
                commentUSD
                )
            VALUES
                (
                _commentParentId,
                _commentObjectType,
                _commentObjectId,
                _commentText,
                _commentAuthorName,
                _commentAuthorEmail,
                _commentAuthorWebsite,
                _commentSubscribe,
                _commentIsDisabled,
                _commentIsActive,
                _commentCSI,
                _commentCSD,
                _commentUSI,
                _commentUSD
                );
    
    
    
        SET _commentId = LAST_INSERT_ID();
    
    
        CALL EventInsert(6, Now(), _commentId, _commentObjectType, _commentObjectId, null, null, 'Comment Added', 1, _commentCSI, Now(), _commentUSI, Now());
    
    
    
        SELECT _commentId INTO _commentIdOut ;
    
        END $$
    
    DELIMITER ;
    
    
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `EventInsert` $$
    CREATE DEFINER=`root`@`%` PROCEDURE `EventInsert`(
            IN _eventTypeId int,
            IN _eventCreateDate datetime,
            IN _eventObjectId bigint,
            IN _eventAffectedObjectType1 int,
            IN _eventAffectedObjectId1 bigint,
            IN _eventAffectedObjectType2 int,
            IN _eventAffectedObjectId2 bigint,
        IN _eventText varchar(1024),
            IN _eventIsActive tinyint,
            IN _eventCSI int,
            IN _eventCSD datetime,
            IN _eventUSI int,
            IN _eventUSD datetime
    
        )
    BEGIN
    
            INSERT INTO event
                (
                eventTypeId,
                eventCreateDate,
                eventObjectId,
                eventAffectedObjectType1,
                eventAffectedObjectId1,
                eventAffectedObjectType2,
                eventAffectedObjectId2,
          eventText,
                eventIsActive,
                eventCSI,
                eventCSD,
                eventUSI,
                eventUSD
                )
            VALUES
                (
                _eventTypeId,
                _eventCreateDate,
                _eventObjectId,
                _eventAffectedObjectType1,
                _eventAffectedObjectId1,
                _eventAffectedObjectType2,
                _eventAffectedObjectId2,
          _eventText,
                _eventIsActive,
                _eventCSI,
                _eventCSD,
                _eventUSI,
                _eventUSD
                );
    
    
        END $$
    
    DELIMITER ;
    

2 个答案:

答案 0 :(得分:1)

找到它。在EventManager.GetEventFeed查询中简化为此行:

AND eventCreateDate <= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />

发生的事情是在EventInsert过程中调用的MySql Now()函数比查询中使用的Coldfusion #Now()#晚了一小部分。因此,代码行排除了该记录。此外,为什么只有在快速添加注释时才会发生这种情况。

什么是生物片。感谢大家的意见和建议。

答案 1 :(得分:0)

让我直截了当: 你调用一个MySQL SP,它执行一个插入,然后调用另一个SP来执行另一个插入。 这两者之间没有回归ColdFusion?是吗?

如果是这种情况,那么您的SP可能无法正确返回值,或者您在错误的位置查找结果。

我更倾向于使用MySQL SP出现问题。它们并不完美,并没有真正为您带来很多性能优势。视图很有用,但坦率地说,SP有点垃圾。我怀疑当你从第一个SP中调用第二个SP并且它返回一个值时,它没有被正确地从原始SP传递回ColdFusion,因此缺乏结果。

老实说,我的建议是在合适的DAO或服务中编写两个ORM函数或简单的cfqueries,以便首先记录插入注释的结果并返回一个值。返回该值后,再调用该函数以根据返回的注释ID获取事件。 (ColdFusion 8会给你Generated_Key,ColdFusion 9是生成的密钥,我不确定它在Railo中会是什么,但它会出现在“result”属性结构中)。

考虑到这一点,我甚至不确定你为什么要根据刚刚输入的纪念品来举办活动。您刚刚添加了针对某个事件的评论,因此您应该已经拥有该事件的一些数据,即使它只是您可以从中获取完整事件记录/对象的ID而无需通过评论绕过该房子

总而言之,我建议退一步看一下你正在使用的数据流,然后重构它。