與lucene親密接觸第二集,關於jdbc的一個疑惑

來源:互聯網
上載者:User

繼續咱們的lucene之旅,

今天結合jdbc把資料庫中的內容建到倒排序索引檔案去。使用jdbc的時候出現了一個疑惑,調了半天也沒明白。

 

我有一個類 Db負責與資料庫互動,在構造的時候建立資料庫連接池,然後通過這個類的其他方法對資料庫進行互動。

我有大概20萬條表記錄需要插到lucene的倒排序檔案中,

然後思路很簡單,我直接遍曆資料庫。

 

由於記憶體有限,我不可能直接讀出整個資料庫來索引,於是採取的分塊進行。每次讀出若干條,建索引,釋放,然後讀出下N條……

問題出現了,我發現不一會兒,java就記憶體溢出了!

仔細找了幾遍代碼,發現該釋放的都釋放了。。只是沒有釋放資料庫連接池,於是我懷著很懷疑的態度,在每次處理一個塊之後重建串連池,居然就沒有溢出了!

 

按道理說資料庫連接池不釋放掉應該是不佔查詢內容的,只要將資料庫查詢的result釋放就可以了,於是這個問題。。百思不得其解,先將代碼貼上來,以後持續關注該問題。(這是每次釋放,不會記憶體溢出的代碼)

 

Db.class

 

import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.PreparedStatement;<br />import java.sql.ResultSet;<br />import java.sql.SQLException;</p><p>import com.mysql.jdbc.*;</p><p>//用於封裝對資料庫操作<br />public class Db {</p><p>private Connection conn = null;</p><p>private static String userName = "cg";<br />private static String password = "XXXXXX";<br />private static String databaseIP = "192.168.25.152";<br />private static String databaseName = "medias";<br />//資料庫查詢結果<br />//private ResultSet rset = null;<br />PreparedStatement pstmt = null;</p><p>///初始化資料庫連結<br />public Db()<br />{<br />this.Init();<br />}</p><p>public void Init()<br />{<br />try{<br /> String url = "jdbc:mysql://"+ databaseIP + "/" + databaseName;<br /> Class.forName ("com.mysql.jdbc.Driver").newInstance();<br /> conn = DriverManager.getConnection (url, userName, password);<br /> System.out.println ("資料庫初始化成功");</p><p>}<br />catch( Exception e){<br />e.printStackTrace();<br />System.err.println(e.toString());<br />}<br />}</p><p>public ResultSet Begin( long start,long size )<br />{<br />String exec = "select * from media limit " + String.valueOf(start)<br />+ "," + String.valueOf(size);<br />ResultSet rset=null;<br />try<br />{<br />pstmt =<br />conn.prepareStatement(exec);<br />rset=pstmt.executeQuery();</p><p>}<br />catch( Exception e ){}<br />return rset;<br />}</p><p>public Movie Next(ResultSet rset) throws SQLException{<br />Movie result = new Movie();<br />if( rset.next())<br />{<br />result.title = rset.getString("title");<br />String id = rset.getString("media_id");<br />String exec = "select * from media_source where movie_id=" + id;<br />try<br />{<br />PreparedStatement pstmt =<br />conn.prepareStatement(exec);<br />ResultSet rset2=pstmt.executeQuery();</p><p>//對media_source操作<br />while( rset2.next() )<br />{<br />MovieTip tip = new MovieTip();<br />tip.url = rset2.getString("source_url");<br />result.AddTip(tip);<br />}<br />rset2.close();<br />}<br />catch( Exception e )<br />{<br />System.err.println(e.toString());<br />}</p><p>return result;<br />}<br />else<br />{<br />pstmt.close();<br />result.isFinish = true;<br />return result;<br />}<br />}</p><p>//關閉資料庫<br />public void Close()<br />{<br /> if (conn != null)<br /> {<br /> try<br /> {<br /> conn.close ();<br /> System.out.println ("資料庫關閉");<br /> }<br /> catch (Exception e) { /* ignore close errors */ }<br /> }<br />}<br />}</p><p>

 

調用相關代碼

 

try<br />{<br />System.out.println("正在添加第"+start+"到"+(start+size)+"條記錄");</p><p>indexWriter = new IndexWriter(indexDir, luceneAnalyzer,<br />false, IndexWriter.MaxFieldLength.LIMITED);<br />Db dbQueryer = new Db();//初始化資料庫連接器<br />//dbQueryer.Init();<br />ResultSet rs=dbQueryer.Begin(start, size);<br />while( true )<br />{<br />Movie movie = dbQueryer.Next(rs);<br />if( movie.isFinish == true )<br />break;<br />else<br />{<br />Document document = new Document();<br />String urllist = "";<br />for(int i=0;i<movie.sources.size();i++)<br />{<br />MovieTip tip = (MovieTip)(movie.sources.get(i));<br />urllist += tip.url + "<br>";<br />}</p><p>Field FieldTitle = new Field("title", movie.title, Field.Store.YES,<br />Field.Index.ANALYZED,<br />Field.TermVector.WITH_POSITIONS_OFFSETS);<br />Field FieldUrl = new Field("url", urllist, Field.Store.YES,<br />Field.Index.ANALYZED,<br />Field.TermVector.WITH_POSITIONS_OFFSETS);<br />//System.out.println(movie.title);<br />document.add(FieldTitle);<br />document.add(FieldUrl);<br />indexWriter.addDocument(document);<br />}<br />}</p><p>rs.close();</p><p>indexWriter.optimize();<br />indexWriter.close();<br />dbQueryer.Close();<br />System.out.println("添加成功");

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.