我正在开发一个应该接收来自数百个业务部门的夜间报告的服务器。报告目前是加密的csv文件。这些报告总共应该每天保存在数据库中以供日后使用,其数量应达到50万到100万条。如何在并发批处理中绕过JDBC语句缓存?
我为每个传输创建了一组PreparedStatements。这些语句用于在执行和提交之前批量处理50条记录。每个记录可能会导致多达20个数据库插入。当传输排队并逐个处理时一切正常。
因为我试图同时做到这一点,我注意到不同的线程得到了完全相同的PreparedStatements实例。这引起了以下问题
- 多个线程添加语句到同一批次当任何线程决定是时候这样做
- 提交被调用时数据库没有达到它的
- 批次正在执行约束一些线程还没有来得及使用某些语句
的问题是:是那里是要创建一种强制一份声明而不是重用现有从语句缓存?
如果不是有没有更好的方式来处理比
- 创建不具有语句/连接池
- 从数据库中取消约束批次单独的数据源的情况;插入顺序也没有什么关系了
- 迫使顺序处理
编辑:试图澄清这一问题
要有线程T1和T2。 让我们准备好陈述S1和S2。 让批次B1和B2。
每次使用S1时,都将其添加到B1中。每次使用S2时,它都被添加到B2中。 提交时,必须在每个外键约束S2之前提交S1。当
- T1处理传输兴高采烈
- T2处理传输发生
问题无辜
- T1使用语句S1添加S1A到含有批量B1 S1A
- T1使用语句S2添加S2A批量B2包含s2a
- T1决定是时候提交
- T1提交batch B1 contai宁S1A
- T2使用S1添加S1b到含有批量B1 S1B
- T2使用S2添加含有S2A S2B到批次B2,S2B
- T1提交批处理B1 containting S2A,S2B
- 数据库说 '否'因为s2b是在外键禁止的s1b之前提交的。
这可以避免与手动同步以及指出的答案,但然后我仍然需要分别跟踪每个批次的大小,而不是应用每个线程的本地逻辑。
您必须使用供应商特定的方法来执行您所需的操作。你在使用哪种RDBMS? – Juris 2009-08-25 11:41:01
Aww。这真的不是我想听到的。目前该测试系统在Apache Derby上运行。生产数据库将是Oracle 10g或R – 2009-08-25 11:54:47
我会给予两个答案upvote,因为他们帮助我考虑了我的问题。我会提供我在设法测试时选择的解决方案。 – 2009-08-26 04:24:11