我正在使用berkeley DB JE 4.1.10
我已经使用辅助数据库的概念,我想向数据库插入10,00,000行。
我收到以下错误
线程“主”中的异常com.sleepycat.je.EnvironmentFailureException:(JE 4.1.10)JAVA_ERROR:发生Java错误,可能无法恢复。
在com.sleepycat.je.dbi.EnvironmentImpl.checkIfInvalid(EnvironmentImpl.java:1450)
在com.sleepycat.je.Transaction.checkEnv(Transaction.java:756)
在com.sleepycat.je.Transaction.abort(Transaction.java:105)
在WriteDataUsingCursor.main(WriteDataUsingCursor.java:90)
引起原因:java.lang.OutOfMemoryError:Java堆空间
我为环境和数据库设置了以下参数
环境env = null;
数据库primarydb = null;
SecondaryDatabase secondarydb = null;
@SuppressWarnings(“ rawtypes”)
TupleBinding mybinding = null;
字符串firstdb =“ CDRFirstDatabase”;
字符串seconddb =“ CDRSecondDatabase”;
公共无效setupenvironment()
{
尝试
{
// 环境
文件dbpath =新文件(“ W:/ dhananjay / workspace / BDB-SecondaryDatabase(JEAPI)-SmaxCDR / src / DB1”);
EnvironmentConfig envconfig =新的EnvironmentConfig();
envconfig.setAllowCreate(true);
envconfig.setTransactional(true);
env =新环境(dbpath,envconfig);
//主数据库
DatabaseConfig dbconfig = new DatabaseConfig();
dbconfig.setAllowCreate(true);
dbconfig.setTransactional(true);
dbconfig.setSortedDuplicates(false);
primarydb = env.openDatabase(null,firstdb,dbconfig);
//辅助数据库
SecondaryConfig secondarydbconfig =新的SecondaryConfig();
secondarydbconfig.setAllowCreate(true);
secondarydbconfig.setTransactional(true);
secondarydbconfig.setSortedDuplicates(true);
//为辅助数据库创建密钥
mybinding =新的MyTupleBinding();
SecondaryKey keycreator = new SecondaryKey(mybinding);
secondarydbconfig.setKeyCreator(keycreator);
secondarydb = env.openSecondaryDatabase(null,seconddb,primarydb,secondarydbconfig);
}
catch(异常e)
{
System.out.println(“ Error ----->” + e);
}
}
我正在使用以下代码将数据插入数据库
DBEnvironment dbenv =新的DBEnvironment();
DatabaseEntry theKey =新的DatabaseEntry();
DatabaseEntry theData = new DatabaseEntry();
@SuppressWarnings(“未选中”)
公共静态void main(String [] args)
{
光标游标= null;
事务txn = null;
dbenv.setupenvironment();
尝试
{
txn = dbenv.getEnv()。beginTransaction(null,null);
cursor = dbenv.getPrimaryDB()。openCursor(txn,null);
字符串行= null;
BufferedReader br = new BufferedReader(new FileReader(“ W:/dhananjay/workspace/SMAXCDR/110618_154501.cdr”));
长startTime = System.currentTimeMillis();
while((line = br.readLine())!= null)
{
String [] sArray = line.split(“,”);
CDRData cdrfile =新的CDRData();
theKey =新的DatabaseEntry(sArray [0] .getBytes(“ UTF-8”));
cdrfile.setId(sArray [0]);
cdrfile.setCallTime(sArray [1]);
cdrfile.setDisconnectTime(sArray [2]);
cdrfile.setIngressTrunkID(sArray [3]);
cdrfile.setIngressSignalingIP(sArray [4]);
cdrfile.setIngressMediaIP(sArray [5]);
cdrfile.setEgressTrunkID(sArray [6]);
cdrfile.setEgressSignalingIP(sArray [7]);
cdrfile.setEgressMediaIP(sArray [8]);
cdrfile.setANI(sArray [9]);
cdrfile.setDNID(sArray [10]);
cdrfile.setDNID_with_IngressPrefix(sArray [11]);
cdrfile.setDNID_with_EgressPrefix(sArray [12]);
cdrfile.setCodeMatch(sArray [13]);
cdrfile.setProtocol(sArray [14]);
cdrfile.setCallID(sArray [15]);
cdrfile.setSMaxCallID(sArray [16]);
cdrfile.setRingDuration(sArray [17]);
cdrfile.setPDDDuration(sArray [18]);
cdrfile.setRawDuration(sArray [19]);
cdrfile.setCauseCode(sArray [20]);
cdrfile.setTFlag(sArray [21]);
cdrfile.setRFlag(sArray [22]);
dbenv.getBinding()。objectToEntry(cdrfile,theData);
cursor.put(theKey,theData);
}
cursor.close();
txn.commit();
dbenv.close();
long finishTime = System.currentTimeMillis();
System.out.println(“插入查询所花费的时间:”(finishTime-startTime)“ ms”);
System.out.println(“已插入记录”);
}
最佳答案
游标和事务将一直保留在内存中,直到它们被关闭/提交。您需要分批插入,也许要插入1000个。对于每个批次,在完成后关闭光标,提交事务,然后为下一个批次创建新的事务。