我使用Hibernate支持的JPA作为我的持久性层。我有一个多线程进程,它从Soap调用中聚合数据,然后将一行存储在数据库中。这个过程通常会插入大约700行,大约需要1-3个小时,而Soap调用是主要的瓶颈。
在整个过程中,我插入的表已锁定,不会及时返回select语句。
下面是SQL server错误:
错误消息:锁定请求超时超过了。
如何避免在这个漫长的过程中锁定数据库表?
发布于 2009-07-31 10:07:51
是否插入具有相同事务的所有700行?
您的事务边界在哪里?如果您可以降低您的事务赏金,即只处理实际的insert操作,以便锁被保持。
如果您需要整个过程是原子化的,那么最好将其写入临时表,然后执行批量插入(fast)将其插入主表中。
发布于 2009-07-30 19:56:57
您可能需要更改隔离级别。
以下是一些信息:http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels
它谈到了不同的隔离级别,以及它们能帮助防范什么。这样做的一般方法是从严格的人员开始,如果需要更好的响应时间,则降低响应时间,同时铭记数据完整性/错误读取的要求。
编辑
Spring事务级别用于抽象事务管理器中的JDBC (或其他什么)事务隔离级别。它们是在TransactionDefinition类中定义的,并且是静态成员。
TransactionDefinition.ISOLATION_DEFAULT
Default isolation
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions
TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data
TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads
TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.还存在事务传播级别。您可能正在使用事务进行纯读,这可能是过度的-读不需要事务,写应该始终有一个事务围绕着它们。在TransactionDefinition中传播水平也是确定的。它们通常在弹簧连接文件中用于定义特定调用的序列化和传播。如果你有一个连接的例子,我可能会给出更多的提示/信息。
发布于 2009-07-30 19:58:46
您是否试图在一个JPA事务中发出700个soap请求?别干那事。:-)
https://stackoverflow.com/questions/1208936
复制相似问题