我的服务器存在性能问题。
现在这里是设置:
我租用了一台虚拟服务器(4 GB,2个vCores / Threads)。在此服务器上运行Java程序,该程序通过TCP连接到第二个服务器。一旦服务器1连接到服务器2,服务器2就开始连续发送数据(每分钟约250,000行,每行约50字节数据)。然后,服务器1拆分每一行并通过在服务器1上运行的MySQL数据库的表中添加一行来存储数据。好的,这就是问题:我的服务器1绝不能跟上。
这些是相关的Java部分。
接收数据:
InputStream in = socket.getInputStream();
BufferedInputStream bin = new BufferedInputStream(in);
InputStreamReader inReader = new InputStreamReader(bin, "UTF-8");
BufferedReader reader = new BufferedReader(inReader);
String line;
... something...
while((line = reader.readLine())!=null) {
mySqlConn.WriteReferenceData(line);
}
}
一切都很直接。并编写数据:
public void WriteReferenceData(String line) {
String[] data = line.split(";");
String query = " insert into reference (field1, field2, field3, field4, field5, field6, field7, field8)"
+ " values (?, ?, ?, ?, ?, ?, ?, ?)";
try {
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString (1, data[0]);
preparedStmt.setString (2, data[1]);
preparedStmt.setString (3, data[2]);
preparedStmt.setString (4, data[3]);
preparedStmt.setString (5, data[4]);
preparedStmt.setString (6, data[5]);
preparedStmt.setString (7, data[6]);
preparedStmt.setString (8, data[7]);
preparedStmt.execute();
}
catch (Exception e) {
... something...
}
}
那么我怎样才能提高性能呢?
1。)完全没有,因为服务器太慢了?
2。)使用不同的语言(例如没有口译员)会有帮助吗?
3。)这只是草率编程吗?
谢谢你的帮助! 圣拉斐尔
答案 0 :(得分:1)
好的,它真的归结为单独停止插入每一行。
但是,简单地使用批处理语句作为YCF_L指出是不够的。我还需要修改我的连接参数。如果没有“rewriteBatchedStatements = true”,则没有性能提升。
DriverManager.getConnection("jdbc:mysql://localhost/"
+ database + "?user=userXY&rewriteBatchedStatements=true");
谢谢Jan Khonski,你的回答也会奏效。但是,我认为我的标准是正确的,因为我想列出几种方法。
我最终通过隐式关闭自动提交来丢弃批处理语句并使用延迟的数据库更新。
实现这一目标的一种方法是用START TRANSACTION封装一系列INSERT语句;和COMMIT;
见MySQL Documentation。 到目前为止,当数据库变大时,我没有关于哪种方法运行最佳的结果。
答案 1 :(得分:0)
我也有这个问题。创建一个同时插入多行的SQL查询!以编程方式执行!!!
insert into reference (field1, field2, field3, field4, field5, field6, field7, field8)"
+ " values (v00, v01, v02, v03, v04,v05, v06, v07),
(v10, v11, v12, v13, v14,v15, v16, v17) ..."
只确保SQL查询长度不超过允许的最大值* 65,536 *(对于不同的数据库,它可以有所不同)。
https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html SQL语句已预编译并存储在PreparedStatement对象中。然后,可以使用此对象多次有效地执行此语句。
每次新线出现时,您都会创建PreparedStatement对象!而是收集多行,然后制作一个插入语句!