gpt4 book ai didi

java - Java中的多个爬虫数据库连接

转载 作者:行者123 更新时间:2023-11-30 22:44:30 24 4
gpt4 key购买 nike

假设我为同一个 URL 实例化了多个抓取工具。他们将经过处理的 URL 写入 MySQL 数据库。在处理 URL 之前,他们会在数据库中检查该页面的记录是否存在,因此它不会再次处理已经处理过的页面。

问题是,如果我的逻辑是正确的话,应该存在某种锁,以便只有其中一个可以从该特定表读取或写入。因此,我只实例化了一个数据库连接 (JDBC) 供他们使用。不过,我不确定这样做是否正确。

所以我的问题是:从单个数据库连接执行的语句是按顺序运行的(它们是否排队),还是取决于数据库引擎的配置。

最佳答案

So, I instantiated only one database connection (JDBC) for them to use. Still, I am unsure if this is right thing to do.

我最近遇到了一些类似的情况。我选择只有一个 JDBC 连接并使用 Lock 在线程之间共享此连接。

需要某种状态标志来指示正在处理一个特定的 URL。

检查下面我的简单片段说明了前面的要点。

do statements executed from single database connection run sequentially(are they queued) or does this depend on database engine it's configuration.

为了消除疑虑,让您的 Java 代码确保语句按顺序运行。这将消除以后因意外错误而产生的任何麻烦。

代码片段

CrawlerThread.java

public class CrawlerThread extends Thread {

public void run() {
String url=null;
try {
String url = urlDao.getNextUrlToProcess();

if (url!=null) {
// Process URL here...
}
} catch(Exception e) {
// Handle exception here...
} finally {
urlDao.markUrlAsFetched(url);
}
}
}

UrlDAO.java

public class UrlDAO {

public String getNextUrlToProcess() {
Connection jdbcConnection = null;
String url = null;

try {
jdbcConnection = connectionManager.acquireSharedConnection();

// Perform query to get next url
// SELECT url FROM urls WHERE status = 'NEED_FETCH' LIMIT 1
ResultSet rs = ...
if (rs.next()) {
url = ...

// Mark url as being processed
setUrlStatus(jdbcConnection, url, 'BEING_FETCHED');
}
} catch(Exception e) {
// Handle exception here...
} finally {
connectionManager.releaseSharedConnection();
}

return url;
}

public void markUrlAsFetched(String url) {
Connection jdbcConnection=null;

try {
jdbcConnection = connectionManager.acquireSharedConnection();

setUrlStatus(jdbcConnection, url, 'FETCHED');
} catch(Exception e) {
// Handle exception here...
} finally {
connectionManager.releaseSharedConnection();
}
}

private void setUrlStatus(Connection jdbcConnection, String url, String newStatus) {
// UPDATE urls SET status = ? WHERE url = ?
if (url!=null) {
...
}
}
}

ConnectionManager.java

/**
*
* The ConnectionManager opens, closes and shares a JDBC connection among the different threads.
*
*/
public class ConnectionManager {
private Lock connectionLock = new ReentrantLock();
private Connection sharedConnection = ...

public Connection acquireSharedConnection() {
connectionLock.lock();
return sharedConnection;
}

public void releaseSharedConnection() {
connectionLock.unlock();
}
}

关于java - Java中的多个爬虫数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com