【发布时间】:2025-11-27 17:15:01
【问题描述】:
我正在构建一个基本的网络爬虫。我正在使用mysql-connector 连接到我计划存储数据的数据库。我无法从普通的 java String 插入 TEXT 数据类型。
当我尝试插入 String 时,我得到了这个异常:
Exception in thread "main" java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setCharacterStream(ILjava/io/Reader;)V is abstract
at com.mysql.jdbc.PreparedStatement.setCharacterStream(PreparedStatement.java)
at WebCrawler.insertIntoChecked(WebCrawler.java:179)
...
我之前可以使用 FileReader 和方法 .setCharacterStream() 将文本文件 (.txt) 插入到 TEXT 数据类型中。但是我不能用String 做到这一点。我尝试将其转换为StringReader,然后再转换为BufferedReader,但仍然出现同样的错误。
data.head 是一个 String 包含 html 页面的头部,data.body 包含 html 页面的正文。
head 和body 属性(mysql 表)为MEDIUMTEXT,其他所有属性为varchar(x)
将数据插入数据库的方法:
private void insertIntoChecked(SiteData data){
try {
String sql =
"INSERT INTO checked " +
"(URL,title,language, charset, content, head, body)" +
"VALUES " +
"(?, ?, ?, ?, ?, ?, ?);";
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.setString(1, data.url);
preparedStatement.setString(2, data.title);
preparedStatement.setString(3, data.language);
preparedStatement.setString(4, data.charset);
preparedStatement.setString(5, data.content);
BufferedReader sr1 = new BufferedReader(new StringReader(data.head));
BufferedReader sr2 = new BufferedReader(new StringReader(data.body));
preparedStatement.setCharacterStream(6, sr1); // the part that is causing the problem
preparedStatement.setCharacterStream(7, sr2); // ^
sr1.close();
sr2.close();
preparedStatement.execute();
preparedStatement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
【问题讨论】:
-
我从未尝试将 clob 插入 MySQL 数据库。我可以告诉你,在 Oracle 中你插入了一个
EMPTY_CLOB()。插入行后,您将获得对此 CLOB 的引用;从参考你得到一个Writer;那么这只是使用作家的问题。它可能是相似的。有趣的部分是插入首先发生,LOB 数据稍后流式传输(在同一事务期间)。