java – JDBC和线程
发布时间:2020-12-15 04:51:03 所属栏目:Java 来源:网络整理
导读:我有一个程序,需要在给定的时间间隔内查询数据库,并通过它调用的记录执行一些操作,然后再次更新表. 我正在使用ExecutorService来运行线程,但是我想知道,如果每个线程都有自己的连接(因为它需要更新数据库),或者我可以使用我用来查询初始结果的相同连接吗?
我有一个程序,需要在给定的时间间隔内查询数据库,并通过它调用的记录执行一些操作,然后再次更新表.
我正在使用ExecutorService来运行线程,但是我想知道,如果每个线程都有自己的连接(因为它需要更新数据库),或者我可以使用我用来查询初始结果的相同连接吗? 可以连接池工作,我在Oracle 9i上. 解决方法
您应该始终对单独的线程使用单独的连接,因为驱动程序以这种方式不是线程安全的.连接池可以帮助您,因为它允许以安全的方式重用连接.
您还可以执行查询 – 调度模式 – 如果我正确理解您的问题 – 其中一个线程负责查询和启动可能更新数据库的N个线程 – 所有这些线程都有单独的连接对象. 您还可以考虑通过PreparedStatement进行批量更新,因此线程不会在行和表锁中相互偶然发生,使用以下结构: > 1个查询线程 就像一个迷你db fork-join. 编辑 有关如何使用Pstmt进行批量更新的示例: PreparedStatement pstmt = connection.prepareStatement( "UPDATE table SET field=? WHERE id=?"); for (int i = 0; i < 100; i++) { pstmt.setInt(1,i * i); pstmt.setInt(2,i); pstmt.addBatch(); } pstmt.executeBatch(); pstmt.close(); 或者,您可以在循环中查询更新请求从处理线程到达的队列: class WhatToUpdate { public int id; public int value; } Queue<WhatToUpdate> queue = new LinkedBlockingQueue<WhatToUpdate>(); PreparedStatement pstmt = connection.prepareStatement( "UPDATE table SET field=? WHERE id=?"); int poisons = THE_NUMBER_OF_PROCESSING_THREADS; while (true) { WhatToUpdate record == queue.take(); if (record == null) { // poison pill if (--poisons <= 0) { break; } } pstmt.setInt(1,record.value); pstmt.setInt(2,record.id); pstmt.addBatch(); } pstmt.executeBatch(); pstmt.close(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |