`
rcfalcon
  • 浏览: 227975 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

与lucene亲密接触第二集,关于jdbc的一个疑惑

    博客分类:
  • Java
阅读更多

继续咱们的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+庖丁的一个例子

    标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...

    lucene in action 第二版

    根据给定文件信息,这里将详细介绍关于《Lucene in Action 第二版》书籍的知识点。这本书是关于Java Lucene教程的,主要面向开发者学习使用Lucene进行搜索引擎开发。 ### 书名知识点: 《Lucene in Action 第二版...

    lucene之第一次亲密接触

    《Lucene之第一次亲密接触》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写,被广泛应用于各种搜索引擎的构建,包括网站搜索、文档检索、甚至电子邮件过滤等场景。这篇博客将带领...

    Lucene实战(第二版)

    《Lucene实战(第二版)》是一本深入探讨Apache Lucene全文搜索引擎库的权威书籍,主要面向对Java和搜索引擎技术感兴趣的开发者。这本书详尽地介绍了如何利用Lucene进行信息检索、文本分析和索引构建,同时也涵盖了...

    Lucene In Action 第二版 高清中文版+附书源代码

    《Lucene In Action 第二版》是一本深入探讨Apache Lucene全文搜索引擎库的专业书籍,高清中文版的提供为中文读者提供了便利。这本书由Michael McCandless等作者编写,旨在帮助开发者充分利用Lucene的强大功能,构建...

    lucene实战第二版(最新)

    本书《Lucene实战第二版》是一本关于如何使用Lucene进行文本检索的实用教程。这本书详细介绍了Lucene的使用方法和内部工作机制,并提供了丰富的代码示例和清晰的解释。它不仅适合那些计划在应用中使用Lucene的开发者...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    第一个lucene程序

    《第一个Lucene程序详解》 在信息技术领域,搜索引擎的实现是一项关键的技术,而Apache Lucene作为一款开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨如何编写你的“第一个Lucene程序”,帮助...

    Lucene实战中文版第2版

    经典的Lucene资源

    jsp+servlet+jdbc+lucene 搜索引擎

    本项目基于Java技术栈,结合JSP、Servlet、JDBC以及Lucene库,构建了一个功能完备的搜索引擎系统。 **JSP(JavaServer Pages)** JSP是Java平台上的动态网页技术,它允许开发人员在HTML或XML文档中嵌入Java代码,...

    Lucene in Action第二版(中文和英文)

    《Lucene in Action》第二版是一本专注于开源全文搜索引擎库Lucene的专业著作,由美国的Otis Gospodnetic和Erik Hatcher共同撰写。这本书深入浅出地讲解了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者...

    Lucene实战 第二版 完整清晰中文版

    Lucene实战第二版完整清晰中文版是一本介绍Lucene开源全文搜索引擎开发包的书籍。Lucene是一个用Java编写的功能强大的全文搜索引擎库,它以出色的可扩展性和快速的搜索特性获得了广泛的赞誉。本书详细介绍了如何有效...

    Lucene实战(中文版第二版)对应Lucene版本

    《Lucene实战(中文版第二版)》是针对搜索引擎开发领域的经典著作,它详细介绍了如何使用Apache Lucene这个强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,被广泛应用于各种信息检索系统中,包括网站搜索...

    lucene in action 第二版中文版

    lucene in action 第二版中文版,

    Lucene实战(第2版)

    Lucene实战(第2版) Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引...

    Lucene实战第二版中英文PDF(带书签)

    《Lucene实战第二版》是关于全文搜索引擎Lucene的一本权威指南,由Michael McCandless、Erik Hatcher和Dave Bollinger共同撰写。这本书详细介绍了如何使用Java库Lucene来构建高性能、可扩展的搜索功能。以下是该书的...

    lucene,lucene教程,lucene讲解

    第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 public void add(Query query, BooleanClause.Occur occur) BooleanClause用于表示布尔查询子句关系的类,包括: BooleanClause.Occur.MUST,...

    Lucene实战(第二版)源代码

    《Lucene实战(第二版)源代码》是关于Apache Lucene这一开源全文搜索引擎库的一份珍贵资源,包含了大量的示例代码和实现细节。Lucene是一个用Java编写的高性能、全文检索引擎库,它不是一个完整的搜索引擎,而是为...

Global site tag (gtag.js) - Google Analytics