2012-03-12 77 views
0

我正在嘗試編寫一個Dropbox爬網程序的測試。嘗試合併時嘗試鎖定表的超時

我已經設置了一個Fixture,它將數據加載到數據庫中。

Fixtures.deleteDatabase(); 
Fixtures.loadModels("testusers.yaml"); 

問題達到代碼

da = da.merge(); //exceptions gets thrown here 

時發生。它拋出一個JdbcSQLException:

org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "USER"; SQL statement: 
select user0_.id as id7_0_, user0_.activationSent as activati2_7_0_, 
user0_.confirmationCode as confirma3_7_0_, user0_.email as email7_0_, 
user0_.first_name as first5_7_0_, user0_.isAdmin as isAdmin7_0_, 
user0_.lastLogin as lastLogin7_0_, user0_.last_name as last8_7_0_, 
user0_.passwordHash as password9_7_0_, 
user0_.recoverPasswordCode as recover10_7_0_, 
user0_.referralCode as referra11_7_0_, 
user0_.signupDate as signupDate7_0_ from User user0_ where user0_.id=? [50200-149] 

at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
at org.h2.message.DbException.get(DbException.java:167) 
at org.h2.message.DbException.get(DbException.java:144) 
at org.h2.table.RegularTable.doLock(RegularTable.java:499) 
at org.h2.table.RegularTable.lock(RegularTable.java:433) 
at org.h2.table.TableFilter.lock(TableFilter.java:140) 
at org.h2.command.dml.Select.queryWithoutCache(Select.java:571) 
at org.h2.command.dml.Query.query(Query.java:257) 
at org.h2.command.dml.Query.query(Query.java:227) 
at org.h2.command.CommandContainer.query(CommandContainer.java:78) 
at org.h2.command.Command.executeQuery(Command.java:178) 
at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96) 
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:2037) 
... 36 more 

UpdateDropboxRowJob.java在異常得到投擲

package mashpan.crawl.jobs; 

import play.Logger; 
import play.jobs.*; 
import models.DropboxAuthentication; 

public class UpdateDropboxRowJob extends Job { 

    private DropboxAuthentication da; 
    private long count; 
    private boolean crawled; 

    public UpdateDropboxRowJob(DropboxAuthentication da, long count, boolean crawled) { 
     Logger.debug("[UpdateDropboxRowJob] ctor: " 
       +",[da=" + (da == null ? "null" : da.toString()) + "]" 
       +", count=[" + count + "]" 
       +", crawled=[" + crawled + "]" 
       ); 
     this.da = da; 
     this.count = count; 
     this.crawled = crawled; 
    } 

    @Override 
    public void doJob() throws Exception { 
     Logger.debug("[UpdateDropboxRowJob] doJob: " 
       +"da=[" + (da == null ? "null" : da.toString()) + "]" 
       +"count=[" + count + "]" 
       +"crawled=[" + crawled + "]" 
       +"da.count"+(da == null ? "da==null" : da.count) + "]" 
       ); 
     da = da.merge(); //exceptions gets thrown here 
     da.count = this.count; 
     da.crawled = this.crawled; 
     da.save(); 
    } 
} 



@Entity 
public class DropboxAuthentication extends Model { 

    public String type; 

    //public String email; 

    public String token_key; 

    public String token_secret; 

    public long count; 

    public boolean crawled; 

    public byte[] cipher; 

    public byte[] iv; 

    public long lastCrawlTime; 

    @OneToOne 
    public User user; 

    public DropboxAuthentication(String type, byte[] cipher, byte[] iv, String token_key, String token_secret, User u, Date issueDate) 
    { 
     this.type = type; 
     this.cipher = cipher; 
     this.iv = iv; 
     this.token_key = token_key; 
     this.token_secret = token_secret; 
     this.user = u; 
    } 

    @Override 
    public String toString() { 
     return "DropboxAuthentication [type=" + type + ", token_key=" 
       + token_key + ", token_secret=" + token_secret + ", count=" 
       + count + ", crawled=" + crawled + ", cipher=" 
       + Arrays.toString(cipher) + ", iv=" + Arrays.toString(iv) 
       + ", lastCrawlTime=" + lastCrawlTime + ", user=" + user + "]"; 
    } 
} 

我假設有一個與交易有問題,我試着做

JPA.em().getTransaction().commit(); 

,但我給我另一個例外,即事務沒有被激活。令人驚訝的是

JPA.em().getTransaction().begin(); 
JPA.em().getTransaction().commit(); 

引發一個異常,表明已經有一個事務正在運行。

所以可能是主要的問題是發揮如何處理在測試模式下交易

發揮框架:1.2.3

** * ** * ** * * * UPDATE ** * ** * ** * ****

我改變了我的application.conf從

%db=mem 

%test.db=mysql://USER:[email protected]/development 

在我得到一個不同的異常(在同一行中輸入以下如前)現在:

javax.persistence.EntityNotFoundException: Unable to find models.User with id 1 
    at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:133) 
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:233) 
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285) 
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152) 
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090) 
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1038) 
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:630) 
    at org.hibernate.type.EntityType.resolve(EntityType.java:438) 
    at org.hibernate.type.EntityType.replace(EntityType.java:298) 
    at org.hibernate.type.AbstractType.replace(AbstractType.java:176) 
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:212) 
    at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:600) 
    at org.hibernate.event.def.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:337) 
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:303) 
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:258) 
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:84) 
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:867) 
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:851) 
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:855) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:686) 
    at play.db.jpa.GenericModel.merge(GenericModel.java:211) 
    at mashpan.crawl.jobs.UpdateDropboxRowJob.doJob(UpdateDropboxRowJob.java:33) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 

然而,看在分貝我看到用戶實際上堅持在那裏。

+0

你不會碰巧有一個h2控制檯打開,你剛插入一個用戶而沒有提交,是嗎? :) – 2012-03-12 11:46:42

+0

nope,我不; ;-) – forste 2012-03-12 12:04:46

回答

0

該作業是否可能同時被調用?或者還有一些其他服務器代碼正在寫入DropboxAuthentication表?

如果是這樣,也許你可以嘗試通過執行this來增加H2數據庫的鎖定超時時間,以查看它是否有所作爲。

+0

我更新了這篇文章,可能會重新發佈一個不同的名稱 – forste 2012-03-13 09:39:52

相關問題