我正在构建一个翻译E书的应用程序。我有字典文件是.csv文件,我填入java哈希映射。这些词典的容量高达150 MB。我要解决的问题是,为了在localhost中正常工作,我需要将java堆大小增加到512 MB - 对于一个用户我自己这样可以正常工作。当有很多用户使用该应用程序时,我不知道这将如何表现。所以我使用了很多堆。我试图将我的词典移动到mysql数据库 - 但是现在每个单词都可以(可能高达150 000单电子书的话)我正在访问数据库 - 这减少了堆的使用,但是,如果我有更多的用户同时使用该应用程序它会很糟糕。我想第一次解析电子书两次来放置所有单词进入java集 - 只获取电子书中的唯一单词,只将这些单词放入哈希映射字典中,或者当时调用mysql表示多个单词(使用sql"在"运算符中) 。由于java托管按堆使用定价,你可以给我一个替代方法,可以最小化我的用例的堆大小使用。 这是我使用mysql数据库的方式:
public final class ConnectionStrings {
private String USERNAME="root";
private String PASSWORD="";
private String CONN_STRING="jdbc:mysql://localhost/dictionary?useUnicode=true&characterEncoding=utf-8";
public ConnectionStrings()
{
}
public String getUsername()
{ return this.USERNAME;
}
public String getPassword()
{ return this.PASSWORD;
}
public String getConnString()
{ return this.CONN_STRING;
}
}
这是从mysql
获取数据的方法public static String getMySQlTranslation(String word, String combination) throws ClassNotFoundException, SQLException {
ConnectionStrings c = new ConnectionStrings();
String CONN_STRING = c.getConnString();
String USERNAME = c.getUsername();
String PASSWORD = c.getPassword();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
String returnedWord = "-";
String upit = "select translated_word from dictionary where native_word = ? and combination= ? limit 1";
stmt = conn.prepareStatement(upit);
stmt.setString(1, word);
stmt.setString(2, combination);
rs = stmt.executeQuery();
while (rs.next()) {
returnedWord = rs.getString("translated_word");
}
stmt.close();
rs.close();
conn.close();
return returnedWord;
}//
这是在代码中调用方法的方式
translated_word=Translator.getMySQlTranslation(check, description);