继续咱们的lucene之旅,
今天结合jdbc把数据库中的内容建到倒排序索引文件去。使用jdbc的时候出现了一个疑惑,调了半天也没明白。
我有一个类 Db负责与数据库交互,在构造的时候建立数据库连接池,然后通过这个类的其他方法对数据库进行交互。
我有大概20万条表记录需要插到lucene的倒排序文件中,
然后思路很简单,我直接遍历数据库。
由于内存有限,我不可能直接读出整个数据库来索引,于是采取的分块进行。每次读出若干条,建索引,释放,然后读出下N条……
问题出现了,我发现不一会儿,java就内存溢出了!
仔细找了几遍代码,发现该释放的都释放了。。只是没有释放数据库连接池,于是我怀着很怀疑的态度,在每次处理一个块之后重建连接池,居然就没有溢出了!
按道理说数据库连接池不释放掉应该是不占查询内容的,只要将数据库查询的result释放就可以了,于是这个问题。。百思不得其解,先将代码贴上来,以后持续关注该问题。(这是每次释放,不会内存溢出的代码)
Db.class
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.*;
//用于封装对数据库操作
public class Db {
private Connection conn = null;
private static String userName = "cg";
private static String password = "XXXXXX";
private static String databaseIP = "192.168.25.152";
private static String databaseName = "medias";
//数据库查询结果
//private ResultSet rset = null;
PreparedStatement pstmt = null;
///初始化数据库链接
public Db()
{
this.Init();
}
public void Init()
{
try{
String url = "jdbc:mysql://"+ databaseIP + "/" + databaseName;
Class.forName ("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection (url, userName, password);
System.out.println ("数据库初始化成功");
}
catch( Exception e){
e.printStackTrace();
System.err.println(e.toString());
}
}
public ResultSet Begin( long start,long size )
{
String exec = "select * from media limit " + String.valueOf(start)
+ "," + String.valueOf(size);
ResultSet rset=null;
try
{
pstmt =
conn.prepareStatement(exec);
rset=pstmt.executeQuery();
}
catch( Exception e ){}
return rset;
}
public Movie Next(ResultSet rset) throws SQLException{
Movie result = new Movie();
if( rset.next())
{
result.title = rset.getString("title");
String id = rset.getString("media_id");
String exec = "select * from media_source where movie_id=" + id;
try
{
PreparedStatement pstmt =
conn.prepareStatement(exec);
ResultSet rset2=pstmt.executeQuery();
//对media_source操作
while( rset2.next() )
{
MovieTip tip = new MovieTip();
tip.url = rset2.getString("source_url");
result.AddTip(tip);
}
rset2.close();
}
catch( Exception e )
{
System.err.println(e.toString());
}
return result;
}
else
{
pstmt.close();
result.isFinish = true;
return result;
}
}
//关闭数据库
public void Close()
{
if (conn != null)
{
try
{
conn.close ();
System.out.println ("数据库关闭");
}
catch (Exception e) { /* ignore close errors */ }
}
}
}
调用相关代码
try
{
System.out.println("正在添加第"+start+"到"+(start+size)+"条记录");
indexWriter = new IndexWriter(indexDir, luceneAnalyzer,
false, IndexWriter.MaxFieldLength.LIMITED);
Db dbQueryer = new Db();//初始化数据库连接器
//dbQueryer.Init();
ResultSet rs=dbQueryer.Begin(start, size);
while( true )
{
Movie movie = dbQueryer.Next(rs);
if( movie.isFinish == true )
break;
else
{
Document document = new Document();
String urllist = "";
for(int i=0;i<movie.sources.size();i++)
{
MovieTip tip = (MovieTip)(movie.sources.get(i));
urllist += tip.url + "<br>";
}
Field FieldTitle = new Field("title", movie.title, Field.Store.YES,
Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
Field FieldUrl = new Field("url", urllist, Field.Store.YES,
Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
//System.out.println(movie.title);
document.add(FieldTitle);
document.add(FieldUrl);
indexWriter.addDocument(document);
}
}
rs.close();
indexWriter.optimize();
indexWriter.close();
dbQueryer.Close();
System.out.println("添加成功");
分享到:
相关推荐
标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...
根据给定文件信息,这里将详细介绍关于《Lucene in Action 第二版》书籍的知识点。这本书是关于Java Lucene教程的,主要面向开发者学习使用Lucene进行搜索引擎开发。 ### 书名知识点: 《Lucene in Action 第二版...
《Lucene之第一次亲密接触》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写,被广泛应用于各种搜索引擎的构建,包括网站搜索、文档检索、甚至电子邮件过滤等场景。这篇博客将带领...
《Lucene实战(第二版)》是一本深入探讨Apache Lucene全文搜索引擎库的权威书籍,主要面向对Java和搜索引擎技术感兴趣的开发者。这本书详尽地介绍了如何利用Lucene进行信息检索、文本分析和索引构建,同时也涵盖了...
《Lucene In Action 第二版》是一本深入探讨Apache Lucene全文搜索引擎库的专业书籍,高清中文版的提供为中文读者提供了便利。这本书由Michael McCandless等作者编写,旨在帮助开发者充分利用Lucene的强大功能,构建...
本书《Lucene实战第二版》是一本关于如何使用Lucene进行文本检索的实用教程。这本书详细介绍了Lucene的使用方法和内部工作机制,并提供了丰富的代码示例和清晰的解释。它不仅适合那些计划在应用中使用Lucene的开发者...
《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...
《第一个Lucene程序详解》 在信息技术领域,搜索引擎的实现是一项关键的技术,而Apache Lucene作为一款开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨如何编写你的“第一个Lucene程序”,帮助...
经典的Lucene资源
本项目基于Java技术栈,结合JSP、Servlet、JDBC以及Lucene库,构建了一个功能完备的搜索引擎系统。 **JSP(JavaServer Pages)** JSP是Java平台上的动态网页技术,它允许开发人员在HTML或XML文档中嵌入Java代码,...
《Lucene in Action》第二版是一本专注于开源全文搜索引擎库Lucene的专业著作,由美国的Otis Gospodnetic和Erik Hatcher共同撰写。这本书深入浅出地讲解了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者...
Lucene实战第二版完整清晰中文版是一本介绍Lucene开源全文搜索引擎开发包的书籍。Lucene是一个用Java编写的功能强大的全文搜索引擎库,它以出色的可扩展性和快速的搜索特性获得了广泛的赞誉。本书详细介绍了如何有效...
《Lucene实战(中文版第二版)》是针对搜索引擎开发领域的经典著作,它详细介绍了如何使用Apache Lucene这个强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,被广泛应用于各种信息检索系统中,包括网站搜索...
lucene in action 第二版中文版,
Lucene实战(第2版) Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引...
《Lucene实战第二版》是关于全文搜索引擎Lucene的一本权威指南,由Michael McCandless、Erik Hatcher和Dave Bollinger共同撰写。这本书详细介绍了如何使用Java库Lucene来构建高性能、可扩展的搜索功能。以下是该书的...
第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 public void add(Query query, BooleanClause.Occur occur) BooleanClause用于表示布尔查询子句关系的类,包括: BooleanClause.Occur.MUST,...
《Lucene实战(第二版)源代码》是关于Apache Lucene这一开源全文搜索引擎库的一份珍贵资源,包含了大量的示例代码和实现细节。Lucene是一个用Java编写的高性能、全文检索引擎库,它不是一个完整的搜索引擎,而是为...