[英]Java-MySQL: How to create a Stored Procedure
我使用Mysql处理Java 1.7项目,
我有一种方法,可以在带有PreparedStatement的表中插入大量数据,但这会在GlassFish Server中导致内存不足错误。
Connection c = null;
String query = "INSERT INTO users.infos(name,phone,email,type,title) "
+ "VALUES (?, ?, ?, ?, ?, ";
PreparedStatement statement = null;
try {
c = users.getConnection();
statement = c.prepareStatement(query);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try{
int i =0;
for(Member member: members){
i++;
statement.setString(1, member.getName());
statement.setString(2, member.getPhone());
statement.setString(3, member.getEmail());
statement.setInt(4, member.getType());
statement.setString(5, member.getTitle());
statement.addBatch();
if (i % 100000 == 0){
statement.executeBatch();
}
}
statement.executeBatch();
}catch (Exception ex){
ex.printStackTrace();
} finally {
if(c != null)
{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
c = null;
statement = null;
}
我认为我需要创建一个存储过程来避免出现此内存问题,但是我不知道从哪里开始,是否应该创建过程或函数,以及是否能够在程序中获得某种响应。返回还是什么?
你怎么看待这件事?
用对预准备语句中存储过程的调用替换预准备语句中的插入语句不会以任何有意义的方式影响内存消耗。
您正在用光内存,因为您正在使用非常大的批处理大小。 您应该测试不同批次大小的性能-您会发现,批次大小大于几十到数百时,较大批次的性能改进会迅速减少。
通过使用load data infile
您可能能够获得更高的输入速率。 您将需要处理多行数据,创建一个文本文件并加载该文件。 例如,请参阅此问题 。
您也可以考虑并行化。 例如,打开多个连接,并使用单独的线程向每个连接插入行。 同样,您可以尝试使用load data infile
进行并行加载。
您将必须在硬件设置上尝试各种技术,批处理大小,线程数(每个内核最多不超过一个)等,以查看提供最佳性能的方法。
您可能还需要查看调整一些MySQL参数,删除(以及稍后重新创建)索引等问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.